如何在将对象添加到向量中时创建对象?

时间:2013-04-04 03:26:46

标签: 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<<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的对象吗?我怎么做?据我所知,矢量中的所有对象都应该是一种类型。

5 个答案:

答案 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;
}