如何创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_pointer
vector,因此,您不需要自己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 ++接口实例化为一个子类