我有一个C ++向量。我希望向量包含可变数量的对象。
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
}
我可以创建矢量来同时保存Dealer,Bot和Player的对象吗?我怎么做?据我所知,矢量中的所有对象都应该是一种类型。
答案 0 :(得分:57)
要回答问题的第一部分,必须先创建一个Player类型的对象,然后才能使用它。当你说push_back(Player)
时,它意味着“将播放器类添加到向量中”,而不是“将向量类型的对象添加到向量中”(这就是你的意思)。
您可以像这样在堆栈上创建对象:
Player player;
vectorOfGamers.push_back(player); // <-- name of variable, not type
或者你甚至可以创建一个内联的临时对象并推送它(当它被放入向量时它会被复制):
vectorOfGamers.push_back(Player()); // <-- parentheses create a "temporary"
要回答第二部分,您可以创建基本类型的向量,这将允许您推回任何子类型的对象;但是,这不会按预期工作:
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 :(得分:5)
问题1:
vectorOfGamers.push_back(Player)
这是有问题的,因为您无法直接将类名推送到矢量中。 您可以将类的对象推入向量,也可以将引用或指向类类型的指针推送到向量中。例如:
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?
是的,你可以。您可以创建指向基类Gamer
的指针向量。
一个很好的选择是使用smart_pointer
的向量,因此,您不需要自己管理指针内存。由于其他三个类派生自Gamer
,基于多态性,您可以将派生类对象分配给基类指针。您可以在以下帖子中找到更多信息:std::vector of objects / pointers / smart pointers to pass objects (buss error: 10)?
答案 2 :(得分:1)
您无法将类插入到矢量中,但您可以插入一个对象(前提是它具有正确的类型或可转换的)。
如果类型Player
具有默认构造函数,则可以通过执行Player()
来创建临时对象,这应该适合您的情况:
vectorOfGamers.push_back(Player());
答案 3 :(得分:0)
// create a vector of unknown players.
std::vector<player> players;
// resize said vector to only contain 6 players.
players.resize(6);
值始终被初始化,因此6个玩家的向量是6个有效玩家对象的向量。
至于第二部分,你需要使用指针。 Instantiating c++ interface as a child class
答案 4 :(得分:0)
我知道线程已经全部,但是在检查过程中,我想出了一个解决方案(下面列出的代码)。希望能对您有所帮助。
for (int i = 0; i <= f.length-1; i++) {
for(int j = 0; j < 5; j++) {
if (f[i] >= (j*10 +1) && f[i] <= (j+1)*10) {
asterisk[j] += "*";
}
}
}
其产生的结果是:
#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;
}