初心者のような質問で申し訳ありません。ここに私の問題があります:
MyClass* c = new MyClass("test");
method(c);//error cannot convert MyClass* to MyClass
定義 :
method(MyClass c);
も定義する必要がありますか?
method(MyClass* c);
コードを複製したくないのですが、適切な方法は何ですか?
初心者のような質問で申し訳ありません。ここに私の問題があります:
MyClass* c = new MyClass("test");
method(c);//error cannot convert MyClass* to MyClass
定義 :
method(MyClass c);
も定義する必要がありますか?
method(MyClass* c);
コードを複製したくないのですが、適切な方法は何ですか?
あなたは明らかに Java プログラマーです。まず、次のことを行う必要があります。
MyClass* c = new MyClass("test");
c
これは「へのポインター」であることに注意してください。これは、式が動的に割り当てられたオブジェクトへのポインターを提供するMyClass
ために必要です。new
これを引数を取る関数に渡すにはMyClass
、ポインターを逆参照する必要があります。つまり、次のことを行います。
method(*c);
関数は (参照ではなく) by 値を取るためMyClass
、オブジェクトが関数にコピーされることに注意してください。MyClass
内部のオブジェクトmethod
は、以前に割り当てたオブジェクトのコピーになります。引数の型は、関数で何を実行し、何を伝えたいかによって異なります。代わりにオブジェクトへの参照が必要な場合、関数内のオブジェクトを変更するとc
関数外のオブジェクトが変更されるようにするには、関数が引数を取る必要があります。MyClass&
これは への参照MyClass
です。
引数を typeMyClass*
にする場合は、次のように簡単に実行できます。
method(c);
これにより、参照を渡すのと同様のセマンティクスが得られます。これは、ポインターc
が関数にコピーされますが、ポインターが参照するオブジェクトは動的に割り当てられたMyClass
オブジェクトのままであるためです。つまり、関数内で変更する*d
と、 が指すオブジェクトc
も変更されます。
このように生のポインタを渡すことは、通常、あまり良い方法ではありません。関数は、ポインターが null でないことを明示的に確認する必要があります。そうしないと、特定の条件下でプログラムがクラッシュする可能性があります。参照渡しのセマンティクスが必要な場合は、参照型を使用してください。それが目的です。
MyClass
ただし、最初からオブジェクトを動的に割り当てない方がよいでしょう。new
Javaでたくさんやったから使っているだけだと思います。C++ では、オブジェクトを動的に割り当てるnew
ために式が使用されます。多くの場合、オブジェクトを動的に割り当てたくありません。自動保存期間で作成しても問題ありません。次のようにします。
MyClass c("test");
method(c);
C++ では、正当な理由がない限り、ポインターと動的割り当てを避けることをお勧めします。エラーやバグの余地がある、より複雑なコードにつながるだけです。実際、あなたが与えたコードにはすでに問題がありますdelete c;
。私が提案したようにすれば、明示的に何かを削除する必要はありません。なぜなら、オブジェクトはスコープ外になると破棄されるからです。
MyClass *c = new MyClass("test");
method(*c);
次のようなメソッドを定義すると機能しますmethod(MyClass c)
しかし、次のようにメソッドを定義するとmethod(MyClass *c);
それならそうあるべき
MyClass *c = new MyClass("test");
method(c);
2 つの選択肢は、作成したオブジェクトで何をしたいかによって結果が異なります。