1. ホーム
  2. c++

[解決済み] ベクターに追加しながらオブジェクトを作成するには?

2022-01-28 15:45:25

質問内容

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
}

ディーラー、ボット、プレイヤーのオブジェクトを同時に保持するベクターを作成することはできますか?どうすればいいのでしょうか?ベクター内のオブジェクトはすべて1つのタイプでなければならないことは知っています。

どのように解決するのですか?

質問の最初の部分に答えると、それを使用する前にPlayerタイプのオブジェクトを作成する必要があります。あなたが push_back(Player) を追加することを意味します。 クラス to vector" ではなく、 "add an object of type of Player to vector" (これはあなたの意味です).

このようにスタック上にオブジェクトを作成することができます。

Player player;
vectorOfGamers.push_back(player);    // <-- name of variable, not type

あるいは、インラインで一時的なオブジェクトを作り、それをプッシュすることもできます(ベクターに入れるときにコピーされます)。

vectorOfGamers.push_back(Player());    // <-- parentheses create a "temporary"

2番目の部分に対する答えとしては、基本型のベクトルを作成することで、任意のサブタイプのオブジェクトをプッシュバックすることができます。しかし、これは期待通りに動作しません。

vector<Gamer> gamers;
gamers.push_back(Dealer());    // Doesn't work properly!

ディーラーオブジェクトがベクターに入れられるとコピーされるため 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