如何在将对象添加到向量中时创建对象? 我有一个C++向量。我希望向量能容纳数量可变的对象

如何在将对象添加到向量中时创建对象? 我有一个C++向量。我希望向量能容纳数量可变的对象,c++,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<

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");
}    
#包括
#包括
使用名称空间std;
类testObject{
私人:
int-someInt;
公众:
testObject(inta){someInt=a;}
void show(){cout问题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:

这3个类源于Gamer。我可以创建向量来同时容纳庄家、机器人和玩家的对象吗?我该怎么做?

是的,你可以。你可以创建一个指向基类
Gamer
的指针向量。
一个好的选择是使用
smart\u pointer
的向量,因此,您不需要自己管理指针内存。由于其他三个类是从
Gamer
派生的,基于多态性,您可以将派生类对象分配给基类指针。您可以从这篇文章中找到更多信息:

回答问题问题的第一部分,您必须先创建一个Player类型的对象,然后才能使用它。当您说
push_back(Player)
时,它的意思是“将Player类添加到向量”,而不是“将Player类型的对象添加到向量”(这就是您的意思)

可以按如下方式在堆栈上创建对象:

Player player;
vectorOfGamers.push_back(player);    // <-- name of variable, not type
Player;
vectorOfGamers.push_back(player);//不能将类插入到向量中,但可以插入类的对象(只要对象类型正确或可转换)

如果类型
Player
具有默认构造函数,则可以通过执行
Player()
来创建临时对象,这应该适用于您的情况:

vectorOfGamers.push_back(Player());
//创建未知玩家的向量。
向量机;
//调整所述向量的大小,使其仅包含6名玩家。
玩家。调整大小(6);
值总是初始化的,所以6个玩家的向量就是6个有效玩家对象的向量

至于第二部分,您需要使用指针。

我知道线程已经全部完成,但在检查过程中,我想出了一个解决方案(下面列出的代码)。希望它能有所帮助

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

+1问一个好的问题(你的英语很好)。创建一个Player实例。重复。但是,这两个问题的答案都可以通过谷歌或甚至在这里找到。在问这个问题之前,我真的用谷歌搜索过。可能我搜索的关键字不够准确:(.@eoLithic:它在第一个示例中起作用,因为它创建了一个临时对象(“类型(构造函数参数)”语法)并将其传入;尽管语法相似,但它有一个非常不同的含义;-)是否可以在不在堆上分配它的情况下执行最后一部分(并且仍然具有多态性)?@mtahmed:从技术上讲,它不必在堆上分配——事实上,它是通过一个指针访问的,这使它具有多态性的可能性(同时可以在不进行切片的情况下进行复制)。您也可以获取在堆栈上分配的对象的地址——但您必须小心,仅在销毁对象之前使用它们(当然,这也适用于堆分配的对象,但在使用它们之前很难意外地销毁它们).我明白了。我更想问的是,是否有可能在不进行切片的情况下推回一个对象……是否有一些巧妙的技巧来实现这一点,而无需进行显式分配(或在volatile堆栈上使用指向对象的指针)@mtahmed:不,对不起。当你将一个对象添加到一个向量中时,它会创建一个模板类型的新对象(可以通过放置在现场,也可以通过复制或移动你给它的对象)。无论如何操作,对象都只能容纳它自己的成员(记住,对象的大小是在编译时计算的),而不是继承类中的任何一个,因此派生对象将被切片。(至于虚拟方法,这些方法也将无法访问,因为vtable的(基)类型错误。)
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
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);
#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;
}
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.