2012-03-23 88 views
0

我一直在尋找這個問題2天,但沒有運氣。結構的實例

,我有以下結構預定義

struct Motor : Port { 
Motor(port_t port) : Port(port) {} 
void moveAtVelocity(int velocity) { move_at_velocity(m_port, velocity); } 
.... 
}; 

我再試着撥打結構

Motor M; 

的一個實例,我越來越

Error: No matching function for call to Motor::Motor() 
Note: Candidates are Motor::Motor(port_t) 

怎麼辦我打電話給一個實例,例如我可以使用以下方法

moveAtVelocity(..); 

我知道我搞砸了類和結構和構造函數和析構函數;問題是,我找不到一個適當的教程,如果你可以鏈接一個給我額外的榮譽。

在此先感謝:-)

回答

2

這是正確的;你應該改爲:

Motor M(123); 

(其中123是一個端口)。

當您只是說Motor M;時,編譯器會嘗試通過調用無參數構造函數來構造此對象。你沒有任何定義。但是,您可以只傳遞上面顯示的必需參數。

另一種解決方案是,當然,只需添加一個參數的構造函數,但是這需要你的基類,Port,有一個過,或者你通過一個固定的值:

Motor() : Port(123) {} // fixed value 
Motor() {} // assumes Port has a parameterless constructor 
1

Motor有一個構造函數,它接受一個參數port_t,因此不會生成默認構造函數(一個沒有參數)。嘗試:

Motor M(14); // where 14 is a guess by me at what a `port_t` is. 

如果沒有爲port_t合理的默認值,你可以有一個默認的構造函數添加到Motor

struct Motor : Port { 
    Motor() : Port(14) {} 
    Motor(port_t port) : Port(port) {} 
    void moveAtVelocity(int velocity) { move_at_velocity(m_port, velocity); } 
    .... 
}; 

或在當前的構造函數指定參數的默認值:

struct Motor : Port { 
    Motor(port_t port = 14) : Port(port) {} 
    void moveAtVelocity(int velocity) { move_at_velocity(m_port, velocity); } 
    .... 
}; 
0

我很驚訝,可能有一個教程沒有提到這一點。 C++中沒有任何結構。關鍵字struct定義了 類的類型,與關鍵字class完全相同。唯一的區別是 1)當您使用關鍵字struct時,您從public開始;當你使用關鍵字時,你從private開始;和2) 的繼承默認爲public,其中structprivateclass。所以:

struct Motor : Port 
{ 
    Motor(port_t port) : Port(port) {} 
    // ... 
}; 

是完全一樣的:

class Motor : public Port 
{ 
public: 
    Motor(port_t port) : Port(port) {} 
    // ... 
}; 

而且,由於您提供一個構造函數,編譯器不產生 默認構造函數。