0

初心者のような質問で申し訳ありません。ここに私の問題があります:

MyClass* c = new MyClass("test");
method(c);//error cannot convert MyClass* to MyClass

定義 :

method(MyClass c);

も定義する必要がありますか?

method(MyClass* c);

コードを複製したくないのですが、適切な方法は何ですか?

4

2 に答える 2

2

あなたは明らかに 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ただし、最初からオブジェクトを動的に割り当てない方がよいでしょう。newJavaでたくさんやったから使っているだけだと思います。C++ では、オブジェクトを動的に割り当てるnewために式が使用されます。多くの場合、オブジェクトを動的に割り当てたくありません。自動保存期間で作成しても問題ありません。次のようにします。

MyClass c("test");
method(c);

C++ では、正当な理由がない限り、ポインターと動的割り当てを避けることをお勧めします。エラーやバグの余地がある、より複雑なコードにつながるだけです。実際、あなたが与えたコードにはすでに問題がありますdelete c;。私が提案したようにすれば、明示的に何かを削除する必要はありません。なぜなら、オブジェクトはスコープ外になると破棄されるからです。

于 2013-01-16T19:43:11.743 に答える
1
MyClass *c = new MyClass("test");

method(*c);

次のようなメソッドを定義すると機能しますmethod(MyClass c)

しかし、次のようにメソッドを定義するとmethod(MyClass *c);

それならそうあるべき

MyClass *c = new MyClass("test");
method(c);

2 つの選択肢は、作成したオブジェクトで何をしたいかによって結果が異なります。

于 2013-01-16T19:38:08.910 に答える