2016-01-02 177 views
0

我試圖創建一個子類secondary,它可以與參數一起使用以及重寫類primary。現在,我得到初始化派生類的構造函數中沒有默認構造函數的基類

沒有匹配函數來調用

錯誤。有人能幫助我嗎?

我的代碼:
primary.h:

#ifndef PRIMARY_H 
#define PRIMARY_H 


class primary 
{ 
    public: 
     primary(int x); 
     virtual ~primary(); 
    protected: 
    private: 
     int primary_x; 
}; 

#endif // PRIMARY_H 

primary.cpp:

#include "primary.h" 

primary::primary(int x) 
{ 
    primary_x = x; 
} 

primary::~primary() 
{ 
    //dtor 
} 

secondary.h:

#ifndef SECONDARY_H 
#define SECONDARY_H 
#include "primary.h" 


class secondary : public primary 
{ 
    public: 
     secondary(); 
     virtual ~secondary(); 
    protected: 
    private: 
}; 

#endif // SECONDARY_H 

secondary.cpp:

#include "secondary.h" 

secondary::secondary() 
{ 
    //ctor 
} 

secondary::~secondary() 
{ 
    //dtor 
} 
+2

的[類可能的複製從類繼承,但沒有默認構造函數](http://stackoverflow.com/questions/3714162/class-inherited-from-class-without-default-constructor) –

回答

2

因爲你沒有一個默認的構造函數,編譯器抱怨說,它不能創建一個對象primary,您應該爲secondary構造函數添加參數/將其設置爲默認值:

class secondary : public primary 
{ 
    public: 
     secondary(int x); 
     virtual ~secondary(); 
    protected: 
    private: 
}; 

然後調用基類的構造函數:

secondary::secondary(int x) : primary(x) 
{ 
    //ctor 
} 

或者:

secondary::secondary() : primary(5) 
{ 
    //ctor 
} 

或者只是添加默認構造primary

class primary 
{ 
    public: 
     primary(int x); 
     primary() : primary_x(0) {} 
     virtual ~primary(); 
    protected: 
    private: 
     int primary_x; 
}; 
0
public: 
    secondary(); 

也應該採取一個整數:

public: 
    secondary(int x); 

,然後構造函數的定義:

secondary::secondary(int x) : primary(x) 
{ 
    //ctor 
} 
+1

這不會編譯。 – IInspectable

+0

錯誤是什麼?啊,好的,我明白了;)'secondary :: secondary()'應該像int聲明一樣int。 – xinaiz

+0

你從無處取走了'x'。 – LogicStuff

1

這整個問題看起來你想幹的事,但你忘了那是什麼,在編寫代碼的過程中。

primary構造函數需要一個int和它沒有得到它,因爲

secondary::secondary() { } 

等同於:

secondary::secondary() : primary() { } 

編譯器試圖通過缺省方式構造primary,但它不是默認的,constructible 。由於您聲明瞭構造函數爲int,因此編譯器不再生成默認構造函數。

解決方案:

  • 修改派生類的構造函數:

    secondary::secondary() : primary(10) { } // dummy value 
    

    或模仿基類的構造函數的簽名:

    secondary::secondary(int x) : primary(x) { } 
    
  • 修改基類 - 讓primary默認構造,即聲明構造函數:

    primary(int x = 10) // dummy default argument 
    

    或添加默認構造函數重載:

    primary() = default; 
    
相關問題