56

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

4

5 回答 5

76

要回答问题的第一部分,您必须先创建一个 Player 类型的对象,然后才能使用它。当您说push_back(Player)时,它的意思是“将 Player添加到向量中”,而不是“将 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
于 2013-04-04T03:33:40.623 回答
5

问题一:

   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)?

于 2013-04-04T03:33:21.090 回答
1

您不能将插入向量中,但可以插入类的对象(前提是它是正确的类型或可转换的)。

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

vectorOfGamers.push_back(Player());
于 2013-04-04T03:34:38.893 回答
1

我知道线程已经全部完成,但是当我检查时,我想出了一个解决方案(下面列出的代码)。希望它可以提供帮助。

#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.
于 2020-10-04T16:10:40.790 回答
0
// create a vector of unknown players.
std::vector<player> players;

// resize said vector to only contain 6 players.
players.resize(6);

值总是被初始化的,所以 6 个玩家的向量是 6 个有效玩家对象的向量。

至于第二部分,您需要使用指针。 将 C++ 接口实例化为子类

于 2013-04-04T03:40:20.697 回答