2011-06-14 30 views
2

私はPieceクラスをボード上に表現することになっています。そこから2つの他のクラスを継承する予定です。しかし、私はそうすることで多くの問題を抱えてきました。ここまでは関連するコードです。私は特に、私は理解していないエラーの負荷を取得してい私は私の遺産を台無しにしています

/// 
/// PIECE CLASS HERE 
/// this is an abstract class from which Barrier and Pawn inherit. 

class Piece 
{ 
public: 
    Piece(Space* start); 
    sf::Shape m_Circle; 
protected: 
    int m_X; 
    int m_Y; 
    int m_radius; 
    Space* CurrentSpace; 
}; 

Piece::Piece(Space* start): 
    m_X(start->GetX()), 
    m_Y(start->GetY()), 
    m_radius(14), 
    CurrentSpace(start) 
{} 

/// 
/// BARRIER CLASS HERE 
/// these are the white stones that block a player's path 

class Barrier : public Piece 
{ 
public: 
    Barrier(Space* initial); 
    void Move(Space* target, bool isCapturing); 
}; 

Barrier::Barrier(Space* initial) 
{ 
    Piece(initial); 
    m_Circle = sf::Shape::Circle((float)m_X, (float)m_Y, (float)m_radius, sf::Color(255, 255, 255)); 
    Move(initial); 
} 

void Barrier::Move(Space* target, bool isCapturing) 
{ 
    int xChange = abs(target->GetX() - m_X); 
    int yChange = abs(target->GetY() - m_Y); 
    m_Circle.Move((float)xChange, (float)yChange); 
    CurrentSpace.ToggleOccupied(); 
    if(!isCapturing) 
    { 
     (*target).ToggleOccupied(); 
    } 
    CurrentSpace = target; 
} 

no matching function for call to Piece::Piece() 
declaration of 'Piece initial' shadows a parameter 
no matching function for call to 'Barrier::Move(Piece&)' 
request for member 'ToggleOccupied' in '((Barrier*)this)->Barrier::<anonymous>.Piece::CurrentSpace', which is of non-class type 'Space*'| 

はC++に新しいので、私はこれのいずれかで間違って何が起こっているのか理解していません。私は私がC++を学ぶのに使った本の中で見つけたコードに似たコードを作ろうとしましたが、どうやら見落としてしまったようです。私が呼び出そうとしているすべての関数は、適切な場所に存在しているように見え、プロトタイプと同じ値でそれらを定義すると思います。

答えて

12

最初のエラーは、このによって引き起こされる:

Barrier::Barrier(Space* initial) 
{ 
    Piece(initial); 
    m_Circle = sf::Shape::Circle((float)m_X, (float)m_Y, (float)m_radius, sf::Color(255, 255, 255)); 
    Move(initial); 
} 

ニーズに見えるように:基本クラスのコンストラクタは(どんな)あなたのコンストラクタの前に実行されなかっ

Barrier::Barrier(Space* initial) : Piece(initial) 
{ 
    m_Circle = sf::Shape::Circle((float)m_X, (float)m_Y, (float)m_radius, sf::Color(255, 255, 255)); 
    Move(initial); 
} 

- あなたがする必要があります初期化リストに引数が必要な場合は、引数を渡します。

どのラインが発生しているのかわからないので、他のエラーについてはわかりません。

+2

2番目のエラーは、クラス中の 'Piece(initial)'がローカル変数を宣言した後、 'Move(initial)'が 'Piece'の左辺値を' Barrier :: '移動機能。 –

1

あなたはスーパークラスを初期化したい場合は、このようにそれを実行する必要があります。

Barrier(Space* initial): 
    Piece(initial) { 
    ... 
} 

明示的に基本型を初期化しない場合、コンパイラはしてコンストラクタを呼び出すことによって、それを初期化しようとしますこのような空の引数リスト、:

Barrier(Space* initial): 
    Piece() { 
    ... 
} 

しかし、あなたがゼロの引数を取りワンピースのコンストラクタを定義していないので、あなたが説明したコンパイラエラーを取得します。

4

ライン

Piece(initial); 

中括弧は、コンパイラによって無視されます。あなたは、パラメータと同じ名前の変数を宣言している:

Piece initial; 

initialPieceベースオブジェクトを初期化するには、メンバー初期化子リストを使用する必要があります。

Barrier::Barrier(Space* initial) : Piece(initial) 

また、Move機能2つの引数を期待していますが、あなたは1つしか渡していません。ブール値を忘れました。

+0

いいえ、私は彼が関数を呼び出していて、パラメータinitialを渡していると思います。 –

+0

@Billy: 'Piece'は関数ではありませんが、' Move'は関数です。 – fredoverflow

+0

ええ、その行は一時的なPieceオブジェクトをスタックに作成し、それをinitialで初期化してすぐに破棄します。宣言はありません... – Adrian

1

良い回答です。プラスその最後の困難なライン

request for member 'ToggleOccupied' in '((Barrier*)this)->Barrier::<anonymous>.Piece::CurrentSpace', which is of non-class type 'Space*'|

あなたはポインタであることをCurrentSpaceを宣言しているので、これは

CurrentSpace-> ToggleOccupied()でなければなりません

CurrentSpace.ToggleOccupied();

に起因しています;

+0

うわー、あなたたちは最高です。うまくいけば、私のコーディングスキルは、最終的に私が他人を助けることができるレベルまでになるでしょう!私はそれを固定し、それはすべて再び働く。感謝万円! – GarrickW

関連する問題