2012-03-23 15 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;と言うと、コンパイラは、パラメータのないコンストラクタを呼び出してこのオブジェクトを構築しようとします。あなたは定義されていません。しかし、上記のように必要なパラメータを渡すことはできます。

代替ソリューションは、単にパラメータなしのコンストラクタを追加するには、もちろん、であるが、これはあまりにも1を持っているあなたのベースクラス、Portを、必要とするか、固定値渡しするために:

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

Motorを1つの引数port_tを持つコンストラクタを持っているので、デフォルトのコンストラクタは生成されません(引数なし)。 port_tのための賢明なデフォルト値がある場合は、Motorに既定のコンストラクタを追加することができますいずれか

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

を::

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は、のように、 クラスタイプを定義しています。唯一の違いは です。1)キーワードstructを使用すると、publicが始まります。 キーワードclassを使用すると、privateが開始されます。 2)継承 は、デフォルトではpublicとなり、structとなり、privateclassとなります。だから、:

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

は全く同じである:

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

そして、あなたは、コンストラクタを提供してきましたから、コンパイラは デフォルトコンストラクタを生成しません。

関連する問題