2012-04-26 4 views
0

派生階層のクラスで2つの形式のコンストラクタを試してみると、結果は異なることが分かります。誰か私になぜ教えてもらえますか?以下はテストコードです。デフォルトのクラスコンストラクタの2つの形式は同等ですか?

//Person.h

#ifndef PERSON_H_ 
#define PERSON_H_ 
#include<string> 

using std::string; 

class Person{ 
    private: 
     string firstname; 
     string lastname; 
    public: 
     Person(const char *fn="NoName", const char *ln="NoName"); //A 
     Person(const string &fn, const string &ln); 
     virtual ~Person(){} 

}; 

class Gunslinger:virtual public Person{ 
    private: 
     int notchnum;  
    public: 
     Gunslinger(const char*f="unknown",const char*n="unknown",int not=0);//B 
     virtual ~Gunslinger(){} 
}; 

class PokerPlayer:virtual public Person{ 

    public: 
     PokerPlayer(const char*fn="unknown", const char*ln="unknown");//C; 
     virtual ~PokerPlayer(){} 
};  

class BadDude:public Gunslinger,public PokerPlayer{ 
    public: 
     BadDude(const char*fn="unknown", const char*ln="unknown", int notc=0);//D 

}; 

#endif 

//PersonDefinition.cpp

#include"Person.h" 
#include<iostream> 
#include<cstdlib> 

using std::cout; 
using std::endl; 
using std::cin; 

Person::Person(const char*fn, const char*ln):firstname(fn),lastname(ln){ 
} 

Person::Person(const string &fn,const string &ln):firstname(fn),lastname(ln){ 

} 

Gunslinger::Gunslinger(const char*fn,const char*ln, int not):Person(fn,ln),notchnum(not){ 
} 

PokerPlayer::PokerPlayer(const char*fn,const char*ln):Person(fn,ln){ 
} 

BadDude::BadDude(const char*fn, const char*ln, int notc):Person(fn,ln),PokerPlayer(fn, ln),Gunslinger(fn,ln,notc){ 

} 

//PersonTest.cpp

#include<iostream> 
#include "Person.h" 

int main(){ 
    Person a("Jack","Husain"); 
    PokerPlayer b("Johnson","William",8); 
    Gunslinger c("Mensly","Sim"); 

} 

ので、ここでの問題はあります。上記のプログラムはデフォルトのコンストラクタですべての引数のデフォルト値でコンパイルに失敗し、 '!'の前に 'expected'、 '...'というエラーメッセージがスローされます。トークン "、しかし、私は引数なしのフォームでラインA、B、C、Dのデフォルトのコンストラクタを置き換えた場合、プログラムはコンパイルし、誰でも私に理由を教えてもらえますか?以下はエラーメッセージです。

error message

答えて

1

あなたはすべてのコンストラクタを実装していませんでした。たとえば、コンストラクタPokerPlayer::PokerPlayer(char*, char*)を宣言しましたが、PokerPlayer b("Johnson","William",8);というPokerPlayerを作成しようとしています(つまり、3番目の引数を取るコンストラクタを宣言したことはありません)。前の行が動作するようにする宣言は、GunSlingerを宣言しようとすると正反対の問題が発生します。あなたのGunSlingerクラスは3番目のパラメータを必要とし、その引数なしで宣言しようとしています。

基本クラスがいくつかのタイプのコンストラクタをサポートしていても、それぞれの派生クラスには、明示的に宣言/実装されたすべてのコンストラクタも必要です(デフォルトのコンストラクタは例外です)。ここでEDIT

は、いくつかの半機能コードです:

class PokerPlayer : public Person 
{ 
    ... 
    PokerPlayer(char* fname, char* lname, int val); 
    ... 
}; 

実装

PokerPlayer::PokerPlayer(char* fname, char* lname, int val) : Person(fname, lname, val) 
{ 
    // Anything else we should do... 
} 
+0

私はあなたのアドバイスに従ってコードを変更した、まだプログラムはまだに失敗しますコンパイルして、 '!'の前に 'expected'や '...'のようなエラーメッセージを投げます。トークン "および"予想される一次表現の前に ")トークンを含む。感嘆符はありません。 – JDein

+0

私の例をいくつかの機能コードで更新しました。 – RageD

+0

もう一つの問題があります。上のコードはVS2010で正常にコンパイルされましたが、私は昨日使ったIDEでコンパイルできません。なぜそうなのか? – JDein

関連する問題