0

C++ でオブジェクトをインスタンス化することについて簡単な質問があります。クラスにデフォルトのコンストラクターがあると仮定すると、次のように新しいオブジェクトを作成します。

PfAlgorithm object = new PfAlgorithm();

しかし、実行すると次のエラーが発生します。

conversion from ‘PfAlgorithm*’ to non-scalar type ‘ns3::PfAlgorithm’ requested

誰かがこのエラーの理由を説明してくれませんか? どうもありがとうございました。

4

3 に答える 3

5

演算子はnew、値ではなくポインターを返します。したがって、次のように書く必要があります。

PfAlgorithm* object = new PfAlgorithm()

object新しく割り当てられたPfAlgorithmオブジェクトへのポインタはどこにありますか。ポインタに関する簡単な紹介情報は、ここにあります。ただし、以下のコメントで説明されているように、生のポインタを処理することはほとんどありません(メモリリークの潜在的な問題、あいまいな所有権の問題などのため)。読む...

このオブジェクトをヒープに割り当てたら、使い終わったら必ず削除する必要があります。そうしないと、アプリケーションでメモリリークが発生します。これを簡単にするために、ブーストライブラリ(またはC ++ 11)からのスマートポインタを使用してメモリを管理することも検討することを強くお勧めします。

あるいは、他のさまざまな人が示唆しているように、次のようにすることができます。

PfAlgorithm object;

また、オブジェクトをスタックに割り当て、メモリの管理について心配する必要はありません。

于 2012-07-09T20:18:37.727 に答える
5

C ++よりもJavaの経験が豊富である可能性はありますか?Javaとは異なり、C ++では、オブジェクトをインスタンス化するときに必要ありません。new

PfAlgorithm object;

タイプのオブジェクトを適切に作成しますPfAlgorithm。変数がスコープ外になると、そのオブジェクトは自動的に破棄されます。

于 2012-07-09T20:22:11.113 に答える
1

C++ は、オブジェクト (この場合は PfAlgorithm 型) とオブジェクトへのポインター (PfAlgorithm *) を区別します。このnew PfAlgorithm()式は、新しく割り当てられたオブジェクトへのポインターを返します。それが必要な場合objectは、ポインターの型も作成する必要があります。

PfAlgorithm *object = new PfAlgorithm();

ポインターを使用したくない場合は、次のものを削除しますnew

PfAlgorithm object = PfAlgorithm();

最初のケースではdelete、オブジェクトを使用しなくなったら、オブジェクトを使用する必要があります。2 番目のケースでは、オブジェクトは作成されたブロック ( ) から出るときに破棄さ{...}れます。Java や C# のような自動メモリ管理はありません。

于 2012-07-09T20:23:37.357 に答える