Hoe kan ik objecten maken terwijl ik ze aan een vector toevoeg?

Ik heb een C++-vector. Ik wil dat de vector een variabel aantal objecten bevat.

Visual Studio 2012 geeft me een foutmelding:

Error: type name is not allowed

Van deze C++-code:

#include <iostream>
#include <vector>
using namespace std;
class testObject{
private:
   int someInt;
public:
   testObject(int a){ someInt=a; }
   void show() { cout<<someInt<<endl; }
};
int main()
{
    vector<testObject> testVector;
    cout << "Initial size: " << testVector.size() <<endl;
    for ( int i = 0; i < 3; i++ )
        testVector.push_back(testObject(3));
    cout << "New size: " << testVector.size() << endl;
    for ( int j = 0; j < 3; j++ )
        testVector[ j ].show();
    system("pause");
}    

Maar hier is nog een voorbeeld van code die er hetzelfde uitziet, maar niet werkt.

void Dealer::setNumberOfPlayers( const int tNumber )
{
    for ( int i = 0; i < tNumber; i++ )
        vectorOfGamers.push_back(Player); // Player is a class that I created
}

Kan ik vectoren maken om objecten van Dealer, Bot en Speler tegelijkertijd vast te houden? Hoe doe ik dat? Zoals ik weet, zouden alle objecten in vector van één type moeten zijn.


Antwoord 1, autoriteit 100%

Om het eerste deel van uw vraag te beantwoorden, moet u een object van het type Player maken voordat u het kunt gebruiken. Als u push_back(Player) zegt, betekent dit “voeg de Player klasse toe aan de vector”, niet “voeg een object van het type Player toe aan de vector” (wat je bedoelde).

U kunt het object op de stapel als volgt maken:

Player player;
vectorOfGamers.push_back(player);    // <-- name of variable, not type

Of je kunt zelfs een tijdelijk object inline maken en dat pushen (het wordt gekopieerd wanneer het in de vector wordt geplaatst):

vectorOfGamers.push_back(Player());    // <-- parentheses create a "temporary"

Om het tweede deel te beantwoorden, kunt u een vector van het basistype maken, waarmee u objecten van elk subtype kunt terugduwen; dit werkt echter niet zoals verwacht:

vector<Gamer> gamers;
gamers.push_back(Dealer());    // Doesn't work properly!

Sinds wanneer het dealer-object in de vector wordt geplaatst, wordt het gekopieerd als een Gamer-object — dit betekent dat alleen het Gamer-gedeelte wordt gekopieerd om het object effectief te “snijden”. U kunt echter aanwijzers gebruiken, aangezien dan alleen de aanwijzer wordt gekopieerd en het object nooit wordt gesegmenteerd:

vector<Gamer*> gamers;
gamers.push_back(new Dealer());    // <-- Allocate on heap with `new`, since we
                                   // want the object to persist while it's
                                   // pointed to

Antwoord 2, autoriteit 7%

Vraag 1:

   vectorOfGamers.push_back(Player)

Dit is problematisch omdat je een klassenaam niet rechtstreeks in een vector kunt pushen.
U kunt een object van klasse in de vector duwen of een verwijzing of aanwijzer naar klassetype in de vector duwen. Bijvoorbeeld:

vectorOfGamers.push_back(Player(name, id)) 
  //^^assuming name and id are parameters to the vector, call Player constructor
  //^^In other words, push `instance`  of Player class into vector

Vraag 2:

These 3 classes derives from Gamer. Can I create vector to hold objects of Dealer, Bot and Player at the same time? How do I do that?

Ja dat kan. U kunt een vector van aanwijzers maken die naar de basisklasse Gamer wijst.
Een goede keuze is om een ​​vector van smart_pointer te gebruiken, daarom hoeft u het geheugen van de aanwijzer niet zelf te beheren. Aangezien de andere drie klassen zijn afgeleid van Gamer, gebaseerd op polymorfisme, kunt u afgeleide klasseobjecten toewijzen aan basisklasse-pointers. Mogelijk vindt u meer informatie in dit bericht: std ::vector van objecten / aanwijzers / slimme aanwijzers om objecten door te geven (buss-fout: 10)?


Antwoord 3

Je kunt geen klasse in een vector invoegen, je kunt wel een object (op voorwaarde dat het van het juiste type of converteerbaar is) van een klasse invoegen.

p>

Als het type Player een standaardconstructor heeft, kunt u een tijdelijk object maken door Player() uit te voeren, en dat zou in uw geval moeten werken:

vectorOfGamers.push_back(Player());

Antwoord 4

Ik weet dat de draad al helemaal is, maar terwijl ik aan het controleren was, heb ik een oplossing bedacht (code hieronder vermeld). Ik hoop dat het kan helpen.

#include <iostream>
#include <vector>
class Box
{
    public:
    static int BoxesTotal;
    static int BoxesEver;
    int Id;
    Box()
    {
        ++BoxesTotal;
        ++BoxesEver;
        Id = BoxesEver;
        std::cout << "Box (" << Id << "/" << BoxesTotal << "/" << BoxesEver << ") initialized." << std::endl;
    }
    ~Box()
    {
        std::cout << "Box (" << Id << "/" << BoxesTotal << "/" << BoxesEver << ") ended." << std::endl;
        --BoxesTotal;
    }
};
int Box::BoxesTotal = 0;
int Box::BoxesEver = 0;
int main(int argc, char* argv[])
{
    std::cout << "Objects (Boxes) example." << std::endl;
    std::cout << "------------------------" << std::endl;
    std::vector <Box*> BoxesTab;
    Box* Indicator;
    for (int i = 1; i<4; ++i)
    {
        std::cout << "i = " << i << ":" << std::endl;
        Box* Indicator = new(Box);
        BoxesTab.push_back(Indicator);
        std::cout << "Adres Blowera: " <<  BoxesTab[i-1] << std::endl;
    }
    std::cout << "Summary" << std::endl;
    std::cout << "-------" << std::endl;
    for (int i=0; i<3; ++i)
    {
        std::cout << "Adres Blowera: " <<  BoxesTab[i] << std::endl;
    }
    std::cout << "Deleting" << std::endl;
    std::cout << "--------" << std::endl;
    for (int i=0; i<3; ++i)
    {
        std::cout << "Deleting Box: " << i+1 << " (" <<  BoxesTab[i] << ") " << std::endl;
        Indicator = (BoxesTab[i]);
        delete(Indicator);
    }
    return 0;
}

En het resultaat dat het oplevert is:

Voorbeeld van

Objects (Boxes) example.
------------------------
i = 1:
Box (1/1/1) initialized.
Adres Blowera: 0xdf8ca0
i = 2:
Box (2/2/2) initialized.
Adres Blowera: 0xdf8ce0
i = 3:
Box (3/3/3) initialized.
Adres Blowera: 0xdf8cc0
Summary
-------
Adres Blowera: 0xdf8ca0
Adres Blowera: 0xdf8ce0
Adres Blowera: 0xdf8cc0
Deleting
--------
Deleting Box: 1 (0xdf8ca0) 
Box (1/3/3) ended.
Deleting Box: 2 (0xdf8ce0) 
Box (2/2/3) ended.
Deleting Box: 3 (0xdf8cc0) 
Box (3/1/3) ended.

Antwoord 5

// create a vector of unknown players.
std::vector<player> players;
// resize said vector to only contain 6 players.
players.resize(6);

Waarden worden altijd geïnitialiseerd, dus een vector van 6 spelers is een vector van 6 geldige spelerobjecten.

Voor het tweede deel moet je pointers gebruiken.
C++-interface instantiëren als een onderliggende klasse

LEAVE A REPLY

Please enter your comment!
Please enter your name here

nine + eleven =

Other episodes