配列型から派生したオブジェクトとC ++フィルアレイ
-
27-09-2019 - |
質問
でC ++私は選手へのポインタの配列はオブジェクトを持っていると気まぐれでそれを埋めるためにしたいオブジェクト。私は、すべてのプレイヤーのクラスから派生している別のクラスから別のオブジェクトを埋めることができ、一般的なプレイヤーの配列をしたいからです。
私はこれを行うことができますどのように?
私は選手へのポインタの配列を作成します。
オブジェクトPlayer ** playerArray;
次に、特定のサイズに配列を初期化
playerArray = new Player *[numPlayersIn];
しかし、その後以下は、何らかの理由で仕事をしません
playerArray[i] = new Fickle(0);
どのように私は気まぐれでplayerArrayを埋めることができます(Fickelプレーヤーから派生したクラスである)オブジェクト?
感謝します。
UPDATE:
は、私は(EclipseのIDEでの)エラーメッセージが表示されます。
expected ';' before 'Fickle'
私は気まぐれの定義とは何かかもしれないと思う。
Fickle.hppファイルが含まれています:
#pragma once
#include "player.hpp";
class Fickle: public Player {
public:
// constructor
Fickle(int initChoice){
choice = initChoice;
}
}
このOKですかこれに問題がある?
プレイヤークラスのヘッダーファイルを持っています:
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
};
受け取る方法は気まぐれとプレーヤーのクラスから派生した他のクラスでオーバーライドされます。
UPDATE 2:
OK、私はエラーが実際にコードの異なる部分が原因だと思います。
プレイヤーはメソッドを定義して受け取るます:
virtual void receive(int otherChoice);
サブクラス気まぐれが、気まぐれで定義で上書きする必要があること
void Fickle::receive(int otherChoice) {}
エラーを与える:
no 'void Fickle::receive(int)' member function declared in class 'Fickle'
しかし、受信がプレイヤークラスで定義されているため、これは、なぜ私は知らないのですか?
解決
は、動的に割り当てられた配列のことはできませんの仕事本当の理由はありません。ここで働いてデモコードのビットがあります:
#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;
}
他のヒント
あなたは気まぐれクラスの末尾にセミコロンを忘れてしまったように見えます:
class Fickle: public Player {
// ...
}; // <---- this semicolon
たぶん、どこか他の場所ます。
UPDATE 2:あなたは、派生クラスで仮想関数をオーバーライドするときは、あまりにもそこにそれを宣言しなければなりません。
は、それが正しくコンパイルしていない場合、あなたはおそらく定義は、あなたがそのコードを持って同じソースファイルに#include
というヘッダーをFickle
ませんでした。通常、コンパイラは何Fickle
を知らないことを意味のようなエラーがでます。
んのFickle
はint
またはポインタ型でも受け入れるコンストラクタがありますか?それは個人Player
から派生されていますか?それ以外の場合は、これは動作するはずのように見えます。