2015-12-18 13 views
7

私はArduino用のプログラムを作成しようとしていますが、Itemオブジェクトを別のHolderオブジェクトに渡すときに何か起こっていることはわかりません。C++はコピーコンストラクタの代わりにデフォルトのコンストラクタを呼び出します

class Item { 
    public: 
    int property; 

    Item() { 
     Serial.println("parameterless constructor called"); 
     this->property = 2; 
    } 

    Item(int property) { 
     this->property = property; 
     Serial.println("right constructor called"); 
    } 
}; 

class Holder { 
    public: 
    Item someitem; 

    Holder(Item& someitem) { 
     this->someitem = someitem; 
    } 
}; 

void setup() { 
    Serial.begin(9600); 

    Item someitem = Item(1); 
    Serial.println(someitem.property); 

    Holder hold = Holder(someitem); 
    Serial.println(hold.someitem.property); 
} 

void loop() { 

} 

コンソールに出力されている:私は、私が作成していないよ(パラメータなしのコンストラクタは、最初の場所で呼び出された理由を理解していない

right constructor called 
1 
parameterless constructor called 
1 

私は簡単な例を構築してきました私の理解のための新しいオブジェクト)、そしてなぜそれが現在のオブジェクトを変更したり、新しいオブジェクトを作成したりしないのかということです。パラメータのないコンストラクタを残すことは、コンパイラによって防止されます。

+1

"パラメーターのないコンストラクターを出すことはコンパイラーによって防止されています。"があるときは、コンパイラーによって指定されたエラーを修正する必要があります。 –

+0

@DieterLücking彼はやったが、間違った方法:) – Roddy

答えて

15

あなたは私たちがC++でクラスメンバを初期化する方法を忘れてしまった - member initializer lists:あなたのコードで

Holder(Item const& someitem) : someitem(someitem) {} 

を、someitemは、デフォルト・構築(実行はコンストラクタの{}ブロックに入る前に)最初に、あなたが使用しています代入演算子。

コピーコンストラクタは呼び出されていません(また、すでに構築されているオブジェクト上にあることはできません)。

+2

ありがとう!これはうまくいくと私はさらに読むことを指摘した。私はまだそれが見えるJavaであまりにも多くのことを考えている... – Dominik

関連する問題