1

動的配列を使用していますが、項目を追加および削除する必要がありました。単純に std::vector を使用できる場合に realloc を使用したり、配列のサイズを変更したりすることはお勧めできませんが、配列をベクターに変更する際に問題が発生しています。

これは私の現在のコードです:

int main(){
    // This is what I'm doing now
    State*arr[3];
    int pos = 0;
    arr[0] = new Menu();
    // How do I change it to a vector? This is what I'm trying:
    std::vector<State> vec;
    vec.push_back(Menu());
    ...
}

ただし、「抽象型 'State' のオブジェクトを割り当てることができません」というエラーが表示され続けます。何が間違っていますか?


これらは、クラス State と Menu です。

class State
{
public:
    virtual ~State() {};
    virtual void capture_events() = 0;
    virtual void logic() = 0;
    virtual void render() = 0;
};

Menu : public State
{
public:
    Menu();
    ~Menu();
    void capture_events();
    void logic();
    void render();
};
4

3 に答える 3

0

純粋な仮想メソッド、つまり次のようなメソッドを持つクラスをインスタンス化することはできません

virtual void func() = 0;

=0クラスを派生させ、そこでこのメソッドを実装する必要があることを意味します。この派生クラスはインスタンス化できます。

クラスに純粋な仮想メソッドが含まれている限り、インスタンス化できず、エラーが発生します。

于 2013-10-12T17:02:40.403 に答える
-1

ベクトルを使用する場合、オブジェクトはデフォルトで構築可能でなければなりません。仮想メソッドの 1 つが =0 でマークされてクラス抽象が設定されている場合、クラス State のオブジェクトを構築することはできません。抽象クラスを持つという考えは、そのクラスのオブジェクトを作成できないということです。

あなたがやりたいこと:

State のような抽象ベースを持つクラス ファミリーを作成します。クラスのインスタンス (オブジェクト) へのポインターのベクトルを作成します。new でオブジェクトを作成し、ベクターへのポインターを push_back します。一部の要素を消去する場合は、delete でオブジェクトを削除することを忘れないでください。

ファミリのデストラクタも仮想化することを忘れないでください!

そんな感じ:

class Base
{
     virtual void Do() =0;
     virtual ~Base();
};

class A: public Base
{
     void Do() { ... }
}

class B ...
class C ...

// Create your vector somewhere...
vector<Base*> myVect;


void AddObject()
{
    // It is not important which kind of object you create. Base* obj can "hold" every
    // object which is build from a class which is derived from Base!
    Base* obj=new A();
    myVect.push_back(obj); 
}

void DeleteObj( Base* obj )
{
    myVect.erase( ...find the object...);
    delete obj;
}

void PopBack()  
{
     Base* ptr = myVect.back(); // get last object pointer 
     delete ptr;                // delete the object
     myVect.pop_back();         // remove pointer to object from vector
}
于 2013-10-12T17:03:45.610 に答える