2016-05-01 10 views
-9

これは私の不完全なコードです:誰かが私がやっている説明することで助けることができますC++の継承エラー

enter image description here

:私は、次のようないくつかのコンパイルエラーを取得しています

#include <iostream> 

using namespace std; 

class Tool { 
public: 
int strength; 
char type; 
int result; 

void setStrength(){ 

} 

}; 

class scissors:public Tool{ 
public: 
    scissors(){ 
    strength=0; 
    type=NULL; 
    } 

    scissors(int x){ 
     strength=x; 
     type='s'; 
} 

    bool fight(paper){ 
    paper p1; 
    scissors s1; 
    s1.result=p1.strength < s1.strength; 
    return s1.result; 
    } 

    bool fight(rock){ 
    scissors s1; 
    rock r1; 
    s1.result=r1.strength < s1.strength; 
    return s1.result; 

    } 


}; 

class paper:public Tool{ 
public: 

    paper(){ 
     strength=0; 
    type=NULL; 
    }; 
    paper(int x){ 
     strength=x; 
     type='p'; 

    } 

    bool fight(scissors){ 
    paper p1; 
    scissors s1; 
    p1.result=p1.strength < s1.strength; 
    return p1.result; 
    } 

    bool fight(rock){ 
    paper p1; 
    rock r1; 
    p1.result=r1.strength < p1.strength; 
    return p1.result; 

    } 


}; 

class rock:public Tool{ 
    public: 
    rock(){ 
     strength=0; 
    type=NULL; 
    }; 

    rock(int x){ 
     strength=x; 
     type='r'; 

    } 

    bool fight(paper){ 
    paper p1; 
    rock r1; 
    r1.result=p1.strength < r1.strength; 
    return r1.result; 
    } 

    bool fight(scissors){ 
    rock r1; 
    scissors s1; 
    r1.result=r1.strength < s1.strength; 
    return r1.result; 

    } 


}; 

int main() { 
// Example main function 
// You may add your own testing code if you like 
scissors s1(5); 
paper p1(7); 
rock r1(15); 
cout << s1.fight(p1) << p1.fight(s1) << endl; 
cout << p1.fight(r1) << r1.fight(p1) << endl; 
cout << r1.fight(s1) << s1.fight(r1) << endl; 
return 0; 
} 

間違って、どのように私はこれらのすべてのエラーを修正することができます私はメインで指定されたコードに従ってメインでそれらを比較することができますか?

+2

1番目:_ "これは私の不完全なコードです:" _ Bad! 2番目:スクリーンショットではなく、質問に逐語的なテキストとしてエラーメッセージを投稿してください!第3回:投稿する[MCVE]、ありがとう。 –

+0

不完全なことで、私はまだそれを拡張する予定だということを意味しています。これは私が今言っているエラーと同じコードです。エラーメッセージを逐語的なテキストとして投稿します。フィードバックに感謝します。私の最初の質問 –

+0

これらのクラスをヘッダーファイルと実装ファイルに分け、ヘッダーで前方宣言を使用する必要があります。 –

答えて

0

まず、前方宣言を使用する必要があります。あなたのハサミクラスは、紙や岩が何であるかを知らない。そこテンプレートを使用して作ることができる他の多くの改善点がありますが、これは主な問題となり

class paper; 
class rock; 
class scissors; 

:によってファイルの先頭でそれらを宣言します。たとえば、はさみの場合:

template <typename T> 
bool fight(const T& type) 
{ 
    scissors s1; 
    T type1; 
    return type1.strength < s1.strength; 
} 

次にロックタイプまたはペーパータイプを渡すことができます。

私は個人的には、このコードを盲目的に作成する前に行うことができるより多くの設計上の改善があると思いますが、継承やテンプレートについて知りたい場合は、上記のことが何らかの方法で役立つことを願っています。

+0

テンプレートの実装はクラス宣言の外になければなりません。そうしないと、循環依存関係を解決できません。おそらく、[coliru(http://coliru.stacked-crooked.com/)]の完全なデモにリンクする必要があります。 –

+0

ああ、あなたは正しいです!私はあなたが何を意味しているのか知っていますが、私は自分のはさみクラスを見ていました。ちょうどその式のLHS上にはさみタイプがありますので、それを減らすことができました。 – mojo1mojo2

+1

また、 'bool fight(const T&type)const;のような署名を使うべきです。 –