2

複数レベルの継承を行い、基本コンストラクターを呼び出そうとしていますが、コンパイラーは基本コンストラクターを見つけることができません..

no overloaded function takes 8 arguments

コードのどこが間違っていますか?

基本クラス コンストラクターの .cpp は、デフォルトで 10 個のメンバー変数 int を 0 に設定します。

Baseclass::Baseclass(void) : m_1(0),m_2(0),
                                   m_3(0),m_4(0),
                                   m_x(0),m_y(0),
                                   m_5(0),m_5(0),
                                   m_7(0), m_8(0)
{
}

Baseclass::Baseclass(int _1,int _2,int _3, int _4, int _5,int _6, int _7, int _8)
                                 : m_1(_1),m_2(_2),
                                   m_3(_3),m_4(_4),
                                   m_x(0),m_y(0),
                                   m_5(_5),m_6(_6),
                                   m_7(_7), m_8(_8)
{
}

そして私の最初のサブクラスヘッダーには

class SubclassA:
    public Baseclass
{
public:
    SubclassA(void);
    using Baseclass::Baseclass;
    ~SubclassA(void);

2 番目のサブクラスが続きます。

class SubclassB:
    public SubclassA
{
public:
    SubclassB(void);
    using Baseclass::Baseclass;
    ~SubclassB(void);

次に、このクラスの新しいインスタンスを次のように初期化しようとします。

 SubclassB(Id,0,100,100,10,100,1,1)

using SubclassA::SubclassA;SubclassB 内で有効かどうかはわかり ませんでしたが、問題は解決しませんでした。

4

2 に答える 2

1

引数を指定しない場合、スーパークラスのデフォルト コンストラクターが暗黙的に呼び出されます。引数を渡すには、次のようにサブクラスの明示的なパラメーター化されたコンストラクターを作成する必要があります-

SubclassA::SubclassA(int a, int b, int c, int d, int e, int f, int g, int h) 
: Baseclass(a,b,c,d,e,f,g,h)
{}

SubclassB同じ行で、 のこのコンストラクターを使用して、 class の別のコンストラクターを作成しsubclassAます。階層内の直接のスーパークラスへの参照のみを与えることができるため、Baseclass参照を使用することはできません。SubclassB

C++03 標準の C++ では、コンストラクターがサブクラスによって継承されないため、これがすべて発生する必要があります。その標準以前をサポートするコンパイラでは、サブクラスのコンストラクターによって明示的に呼び出す必要があります。お使いのコンパイラは C++11 をサポートしていないようですので、これで間に合わせる必要があります。

(更新しました)

于 2013-01-09T12:59:51.273 に答える
1

エラー メッセージから、Visual Studio を使用していると思いますか? コンストラクターの継承はサポートしていません。

参照: http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport

現時点でこれをサポートしているコンパイラは Gcc 4.8 だけのようです。

于 2013-01-09T13:00:08.643 に答える