-2

私はC++が初めてです。これが私の問題です。h ファイルでバス、ステッパーをプライベート インスタンスとして宣言します。

class Motor_control
{
public:
       ...
private:
    IICBus bus ;
    IICStepper stepper ;
    IICStepper stepper_r ;
    IICStepper stepper_l ;
};

そして、コンストラクターでそれらを開始します

Motor_control::Motor_control(){
    IICBus bus ("/dev/i2c-2",0,"");
    IICStepper stepper (bus,0x00, "Global addr");
    IICStepper stepper_r (bus,0x6e, "Stepper Modul");
    IICStepper stepper_l (bus,0x66, "Stepper Modul");
}

IICStepper は .cpp で宣言されています。

 IICStepper::IICStepper(IICBus& bus, int addr, const string& name) : IICBase(bus,addr, name) { } in cpp

そして.hで:

class IICStepper : public IICBase { public: IICStepper(IICBus& bus, int addr, const std::string& name); virtual ~IICStepper(){}; ...} 

それはcompalins

       ../src/Motor_control.h:15: error: no matching function for call to 'IICStepper::IICStepper()'
../src/Stepper.h:41: note: candidates are: IICStepper::IICStepper(IICBus&, int, const std::string&)
../src/Stepper.h:38: note:                 IICStepper::IICStepper(const IICStepper&)
../src/Motor_control.h:15: error: no matching function for call to 'IICBus::IICBus()'
../src/Bus.h:28: note: candidates are: IICBus::IICBus(const std::string&, int, const std::string&)
../src/Bus.h:17: note:                 IICBus::IICBus(const IICBus&)
../src/Motor_control.h:15: error: no matching function for call to 'IICStepper::IICStepper()'
../src/Stepper.h:41: note: candidates are: IICStepper::IICStepper(IICBus&, int, const std::string&)
../src/Stepper.h:38: note:                 IICStepper::IICStepper(const IICStepper&)
../src/Motor_control.h:15: error: no matching function for call to 'IICStepper::IICStepper()'
../src/Stepper.h:41: note: candidates are: IICStepper::IICStepper(IICBus&, int, const std::string&)
../src/Stepper.h:38: note:                 IICStepper::IICStepper(const IICStepper&)
../src/Motor_control.h:15: error: no matching function for call to 'IICStepper::IICStepper()'
../src/Stepper.h:41: note: candidates are: IICStepper::IICStepper(IICBus&, int, const std::string&)
../src/Stepper.h:38: note:                 IICStepper::IICStepper(const IICStepper&)
4

3 に答える 3

3

コンストラクタ本体が入る前に、すべてのユーザー型が初期化されます。のデフォルトのコンストラクターがないためIICStepper、エラーが発生します。

初期化リストを使用する必要があります。

Motor_control::Motor_control() : 
   bus("/dev/i2c-2", 0, ""),
   stepper(bus, 0, "Global addr"),
   stepper_r(bus, 0x6e, "Stepper Modul"),
   stepper_l(bus, 0x66, "Stepper Modul") 
{

}

あなたのバージョンはメンバーを初期化しないだけでなく、後で使用することのない新しい一時オブジェクトを作成します。

于 2012-04-30T20:35:39.643 に答える
0

ここでの私の最善の推測は、次のように文字列を引数として渡すときです。

"Global addr"

、文字列は「const std::string&」ではなく「const char*」として渡されます。私の観点からすると、間違ったタイプの変数を渡しているだけです。

于 2012-04-30T20:39:04.647 に答える
0

これは間違っています:

Motor_control::Motor_control(){
    IICBus bus ("/dev/i2c-2",0,"");
    IICStepper stepper (bus,0x00, "Global addr");
    IICStepper stepper_r (bus,0x6e, "Stepper Modul");
    IICStepper stepper_l (bus,0x66, "Stepper Modul");
}

上記のコードは、あなたが思っていることをしません。具体的には、3 つのローカル変数 (コンストラクター関数に対してローカル) を作成します。これらの名前は、偶然にもの 3 つの変数 (メンバー変数) の名前と同じです。このコードはメンバー変数を初期化しません。

表示されるエラー メッセージは、メンバー変数の既定の初期化が原因です。デフォルトの初期化を回避するには、次のようにメンバー変数を初期化リストにリストする必要があります。

Motor_control::Motor_control() : bus("/dev/i2c-2", 0, ""),
    stepper(bus, 0, "Global addr"),
    stepper_r(bus, 0x6e, "Stepper Modul"),
    stepper_l(bus, 0x66, "Stepper Modul") {
}
于 2012-04-30T20:53:04.387 に答える