我有一个C++向量.我希望向量包含可变数量的对象.
Visual Studio 2012给出了一个错误:
Error: type name is not allowed
Run Code Online (Sandbox Code Playgroud)
从这个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");
}
Run Code Online (Sandbox Code Playgroud)
但这是另一个看起来相同的代码示例,但它不起作用.
void Dealer::setNumberOfPlayers( const int tNumber )
{
for ( int i = 0; i < tNumber; i++ )
vectorOfGamers.push_back(Player); // Player is a class that I created
}
Run Code Online (Sandbox Code Playgroud)
我可以创建矢量来同时保存Dealer,Bot和Player的对象吗?我怎么做?据我所知,矢量中的所有对象都应该是一种类型.
Cam*_*ron 63
要回答问题的第一部分,必须先创建一个Player类型的对象,然后才能使用它.当你说push_back(Player),它意味着"将Player 类添加到向量",而不是"向向量添加Player类型的对象"(这就是你的意思).
您可以在堆栈上创建对象,如下所示:
Player player;
vectorOfGamers.push_back(player); // <-- name of variable, not type
Run Code Online (Sandbox Code Playgroud)
或者你甚至可以创建一个内联的临时对象并推送它(它被放入向量时被复制):
vectorOfGamers.push_back(Player()); // <-- parentheses create a "temporary"
Run Code Online (Sandbox Code Playgroud)
要回答第二部分,您可以创建基类型的向量,这将允许您推回任何子类型的对象; 但是,这不会按预期工作:
vector<Gamer> gamers;
gamers.push_back(Dealer()); // Doesn't work properly!
Run Code Online (Sandbox Code Playgroud)
因为当经销商对象被放入向量时,它被复制为Gamer对象 - 这意味着只有Gamer部分被有效地复制"切片"对象.但是,您可以使用指针,因为只有指针才会被复制,并且对象永远不会被切片:
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
Run Code Online (Sandbox Code Playgroud)
问题1:
vectorOfGamers.push_back(Player)
Run Code Online (Sandbox Code Playgroud)
这是有问题的,因为您无法直接将类名推送到向量中.您可以将类的对象推入向量,也可以将引用或指向类类型的指针推送到向量中.例如:
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
Run Code Online (Sandbox Code Playgroud)
问题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?
是的你可以.您可以创建指向基类的指针向量Gamer.一个很好的选择是使用向量smart_pointer,因此,您不需要自己管理指针内存.由于其他三个类是Gamer基于多态性派生的,因此可以将派生类对象分配给基类指针.你可以从这篇文章中找到更多信息:std :: vector of objects/pointers/smart pointers to pass objects(buss error:10)?