1

C++ では、Player オブジェクトへのポインターの配列があり、それを Fickle オブジェクトで埋めたいと考えています。Fickle は Player から派生したクラスです。これは、Player クラスから派生したさまざまなクラスのさまざまなオブジェクトで満たすことができる一般的な Player 配列が必要だからです。

これどうやってするの?

Player オブジェクトへのポインタの配列を作成します

Player ** playerArray;

次に、配列を特定のサイズに初期化します

playerArray = new Player *[numPlayersIn];

しかし、以下は何らかの理由で機能しません。

playerArray[i] = new Fickle(0);

playerArray を Fickle オブジェクト (Fickel は Player から派生したクラス) で埋めるにはどうすればよいですか?

ありがとう。

アップデート:

エラーメッセージが表示されます (Eclipse IDE で):

expected ';' before 'Fickle'

気まぐれの定義と関係があるのではないかと思います。

Fickle.hpp ファイルには次のものが含まれます。

#pragma once
#include "player.hpp";

class Fickle: public Player {
public:
    // constructor
    Fickle(int initChoice){
        choice = initChoice;
    }
}

これでいいですか、それとも問題がありますか?

Player クラスのヘッダー ファイルには次のものが含まれます。

class Player {
private:

public:
    int getChoice();
int choice; // whether 0 or 1
virtual void receive(int otherChoice); // virtual means it can be overridden in subclases
};

receive メソッドは、Fickle および Player クラスから派生した他のクラスでオーバーライドされます。

更新 2:

OK、エラーは実際にはコードの別の部分によるものだと思います。

Player はメソッド receive を定義します:

virtual void receive(int otherChoice);

これは、サブクラス Fickle でオーバーライドする必要がありますが、Fickle での定義は次のとおりです。

void Fickle::receive(int otherChoice) {}

エラーが発生します:

no 'void Fickle::receive(int)' member function declared in class 'Fickle'

しかし、なぜこれがレシーブがPlayerクラスで定義されているためなのかわかりませんか?

4

4 に答える 4

4

おそらく代わりにベクトルを使用する必要がありますが、動的に割り当てられた配列が機能しない本当の理由はありません。以下は、実際に動作するデモ コードの一部です。

#include <iostream>

class Player {
public:
    virtual void show() { std::cout << "Player\n"; }
};

class Fickle : public Player {
public:
    virtual void show() { std::cout << "Fickle\n"; }
};

int main() {
    Player **p = new Player *[2];
    p[0] = new Player;
    p[1] = new Fickle;

    for (int i=0; i<2; i++)
        p[i]->show();

    for (int i=0; i<2; i++)
        delete p[i];
    delete [] p;
    return 0;
}
于 2010-10-01T21:13:43.550 に答える
2

Fickle クラスの最後にあるセミコロンを忘れたようです:

class Fickle: public Player {
    // ...
}; // <---- this semicolon

たぶん別の場所。

更新 2: 派生クラスで仮想関数をオーバーライドするときは、そこでも宣言する必要があります。

于 2010-10-01T21:25:10.323 に答える
1

正しくコンパイルされていない場合は、そのコードを持っているのと同じソース ファイル#includeで定義されているヘッダーがなかった可能性があります。Fickle通常、このようなエラーは、コンパイラが何が何であるかを認識していないことを意味しますFickle

于 2010-10-01T21:29:18.693 に答える
0

or ポインター型Fickleを受け入れるコンストラクターはありますか? intから個人的に派生したものPlayerですか?そうでなければ、これはうまくいくはずです。

于 2010-10-01T21:17:27.917 に答える