0

派生階層のクラスで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のデフォルトのコンストラクターを引数のない形式に置き換えると、プログラムはコンパイルされて正常に実行されます。理由を教えてもらえますか?以下はエラーメッセージです。

エラーメッセージ

4

1 に答える 1

1

すべてのコンストラクターを実装したわけではありません。たとえば、コンストラクターを宣言しましたPokerPlayer::PokerPlayer(char*, char*)が、でPokerPlayerを作成しようとしていますPokerPlayer b("Johnson","William",8);(つまり、3番目の引数を取るコンストラクターを宣言したことはありません)。その前の行を機能させるために必要な宣言は次のとおりです。PokerPlayer::PokerPlayer(char*, char*, int);

さらに、を宣言しようとすると、まったく逆の問題が発生しGunSlingerます。GunSlingerクラスには3番目のパラメーターが必要であり、その引数なしで宣言しようとしています。

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

編集

いくつかの半機能コードは次のとおりです。

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...
}
于 2012-04-26T15:22:50.747 に答える