如何创build对象,而将其添加到vector?

我有一个C ++向量。 我想要vector持有可变数量的对象。

Visual Studio 2012给我一个错误:

Error: type name is not allowed 

从这个C ++代码:

 #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"); } 

但是这里有另一个看起来相同的代码示例,但它不起作用。

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

我可以创buildvector来同时持有经销商,机器人和玩家的对象吗? 我怎么做? 据我所知,vector中的所有对象应该是一种types。

要回答问题的第一部分,您必须先创build一个Playertypes的对象,然后才能使用它。 当你说push_back(Player) ,意思是“将Player 添加到vector中”,而不是“将Playertypes的对象添加到vector中”(这就是你的意思)。

你可以像这样在堆栈上创build对象:

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

或者你甚至可以创build一个内联的临时对象并推送(当它被放入向量时它被复制):

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

要回答第二部分,可以创build一个基本types的向量,这将允许您推回任何子types的对象; 然而,这不会按预期工作:

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

因为当庄家对象被放入向量时,它被复制为一个玩家对象 – 这意味着只有玩家部分被有效地“复制”了对象。 但是,您可以使用指针,因为只有指针才会被复制,并且对象永远不会被切片:

 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 

问题1:

  vectorOfGamers.push_back(Player) 

这是有问题的,因为你不能直接将一个类名称推入一个向量。 您可以将类的对象推入向量中,也可以将引用或类types的指针插入向量中。 例如:

 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 

问题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?

是的你可以。 你可以创build一个指向基类Gamer的指针向量。 一个好的select是使用smart_pointervector,因此,您不需要自己pipe理指针内存。 由于其他三个类是从Gamer派生的,基于多态性,可以将派生类对象分配给基类指针。 你可以从这篇文章中find更多的信息: 对象/指针/智能指针传递对象的std :: vector(buss error:10)?

你不能插入一个到一个向量中,你可以插入一个类的对象 (只要它是正确的types或可转换的)。

如果Player的types有一个默认的构造函数,那么可以通过执行Player()来创build一个临时对象,并且这个对象适用于你的情况:

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

值总是被初始化,所以6个玩家的vector是6个有效玩家对象的vector。

至于第二部分,你需要使用指针。 将c ++接口实例化为一个子类