2011-10-21 6 views
-1

私はチェス盤をプログラミングしています。私は基本クラスchesspiece(私の言語ではschaakstuk)を持っていて、king、queenのようなすべての部分はその基本クラスから派生しています。コンストラクタは抽象クラスからオブジェクトを作ることができません

私はオブジェクトを作成し、ゲームを開始するオブジェクトで配列を埋めたいと思っていました。 Visual Studioはこの行にいくつかのエラーを表示しています:

bord[1][kolom] = new Schaakstuk(Schaakstuk::WIT); 
bord[6][kolom] = new Pion(Schaakstuk::ZWART); 

抽象クラスから作成することは不可能です。私はエラーが表示されません、私はそれが私の派生クラスで純粋なvirutal関数を使用していたことだと思ったが、それではない、私は基本クラスで純粋な仮想関数を使用しています。

コンストラクタ

for(int kolom = 0; kolom < SIZE; kolom++) 
{ 
    bord[1][kolom] = new Pion(Schaakstuk::WIT); 
    bord[6][kolom] = new Pion(Schaakstuk::ZWART); 
} 

Pion.h

#include "Schaakstuk.h" 
#include "Exceptions.h" 

#ifndef PION 
#define PION 

class Pion: public Schaakstuk 
{ 
public: 
    Pion(void); 
    ~Pion(void); 
    bool ZetIsLegaal(int rij1, int kolom1, int rij2, int kolom2) const; 
    void PrintStuk(void) const; 
    void GeefCor(int tabel [8][2], int rij, int kolom, int rij1, int kolom1) const; 
    bool IsPion(void) const { return true; }; 

private: 
    bool ControleerZet(int rij1, int kolom1, int rij2, int kolom2) const; 
}; 

#endif 

Schaakstuk.h

#ifndef SCHAAKSTUK 
#define SCHAAKSTUK 
static const int SIZE1 = 8; 

class Schaakstuk 
{ 
public: 
    enum kleurType { WIT, ZWART }; 
    Schaakstuk(kleurType kleur = WIT) 
    { 
     this->kleur = kleur; 
    }; 
    virtual bool ZetIsLegaal(int rij1, int kolom1, int rij2, int kolom2) = 0; 
    virtual void PrintStuk(void) = 0; 
    virtual void GeefCor(int tabel [8][2], int rij, int kolom, int rij1, int kolom1) = 0; 
    kleurType GeefKleur(void) const { return kleur; }; 
    virtual bool IsPion(void) = 0; 

protected: 
    bool static NietOutOfBounds(int rij, int kolom); 

private: 
    kleurType kleur; 
}; 
#endif 

コードファイルと私のDropboxです。誰か助けてくれますか?

これはエラーです:

http://pastebin.com/82j08rry

、ここでは完全なコードは

http://ideone.com/sWjxS

+8

未知のユーザーのDropboxからRARファイルをダウンロードしていないと確信しています。 –

+1

idecase.comにテストケースを投稿してください。 –

+0

あなたのクラス宣言をあなたの質問に入れてください。しかし、あなたのエラーから判断すると、 'Pion'には純粋な仮想関数があります。本当に' Pion'の新しいインスタンスを直接作成することはできません。すべての純粋な仮想を実装し、抽象的ではありません。 – birryree

答えて

2

ある単語 '抽象' をばらしています。具体的なクラスから作成する必要があります。つまり、コンパイラはそのオブジェクトの内部と外部についてすべてを知る必要があります。

+0

Johnには.cpp .hファイルのみが含まれています。 – user1007522

3

エラーが "抽象クラスをインスタンス化できません"という行に沿っている場合、次の行はどのメソッドが抽象メソッドかを示すはずです。

ほとんどの場合、基本クラスで純粋な仮想を宣言していますが、派生クラスではそれを上書きしないでください(または適切に上書きしません;下を参照)。

まず、オーバーライドがSchaakstukPionであることを確認してから、署名をまったく変更していないことを確認してください。これは、異なるconst/volatile修飾、または異なるメソッドパラメータである可能性があります。

+0

エラーメッセージに基づいて、これが問題です。すべての純粋仮想関数を子クラスに実装する必要があり、署名は正確に一致する必要があります。 – AHelps

+1

ありがとうございました。 const = 0が必要でした;-)すべてがうまくいきました。 – user1007522

関連する問題