2016-08-31 33 views
-4

私はArduinoでcppを使用しています。私はここで起こっている正確に何か分からないが、オブジェクトがパラメータを持たないデフォルトのコンストラクタを探して、その場で作成されているようにそれが表示されたのは、私が"ClassName :: ClassName()"の呼び出しで一致する関数がありません

ClassName o; 

としての私の変数を定義しているとしましょう。私は、変数へのポインタを追加した場合、すべてがうまくしかし

no matching function for call to "ClassName::ClassName()" 

ClassName* o; 

はここで何が起こっている私は、したがって、エラーを、このようなデフォルトコンストラクタを持っていませんか?これらのスタイルのそれぞれを活用するための推奨される方法は何ですか?

+0

'ClassName * o;'はコンストラクタを呼び出さず、オブジェクトも作成しません。指定しない限り、オブジェクトが未定義のメモリ位置を指しています – user463035818

+0

'ClassName * o;'は 'std :: unique_ptr o;'または 'std :: shared_ptr o; '。生ポインタを使用しないでください。 –

+0

私は本当にそれらを別のスタイルと呼んでいません。彼らは異なる目的、用途、生涯の意味を持つ異なる種類です。また、自動記憶期間の変数に未処理ポインタを代入することは、痛みを求めることである。 – jaggedSpire

答えて

4

I'm not sure exactly what is going on here but it appears like the object is being created on the spot, looking for a default constructor that has no parameters. I don't have such a default constructor, hence the error.

。そのような変数を宣言すると、すぐに作成されます。コンストラクタは引数を必要とする場合 - ちょうど宣言でそれらを供給:

Class o(arg); 

あなたはまだargの価値を持っていない場合は - ちょうどあなたが持っているまで、変数を宣言延期。あなたが本当にずっと後まで、オブジェクトを作成延期しなければならない場合には、使用:oがスコープ外になると

std::unique_ptr<Class> o;  // This declare a unique ptr and 
            // initializes it to empty. 

    .... 
    o = make_unique<Class>(arg); // Create the object on the heap, 
            // and store the pointer in 'o'. 

オブジェクトは、(確定)破棄されます。

初心者の方は、生ポインタを使用しないでください。彼らは間違ってしまうのは簡単すぎる。

+0

「o」は範囲外になった後「決定論的に」破壊されると決めるのは何ですか? – Jacksonkr

+1

言語仕様。コンパイラは、変数が定義されているブロックから脱落した場合、関数から戻った場合、または例外を呼び出す場合に、デストラクタが呼び出されるように手配します。この仕様では、呼び出されるデストラクタと、いつ呼び出されるのか(他のデストラクタとの相対関係)に依存することができます。これは、(いつまでたっても)いつオブジェクトがファイナライズされるのかわからないときにガベージコレクタとは異なります。 –

0

クラスがデフォルトコンストラクタを宣言していないようです。おそらく、それはパラメータを持つコンストラクタしか持っていないでしょう。あなたは、ポインタの宣言については

ClassName o; 

のようなクラスのオブジェクトを宣言しようとしているならば、それだけでポインタを宣言デフォルトコンストラクタを宣言する必要が

は、クラスのどちらのオブジェクトが作成されます。ここで何が起こっているかを正確にある

+1

質問と同じように –

関連する問題