2009-11-30 8 views
19

クラスに演算子newdeleteがオーバーロードされています。 newは公開されており、deleteはプライベートです。publicオペレータnew、privateオペレータdelete:newを使用するとC2248「プライベート・メンバにアクセスできません」

このクラスのインスタンスを作成するとき、私は次のエラーを取得する:

pFoo = new Foo(bar) 

example.cpp(1):エラーC2248: 'フー:delete演算子は':プライベートメンバにアクセスすることはできませんが、クラス内で宣言'Foo'

ここではdeleteへの呼び出しはありません。そのため、コンパイラーの頭の中で何が起こっていますか? :)

  1. エラーの原因は何ですか?
  2. メンバーCreateInstanceの機能に頼らずに問題を解決することはできますか?

答えて

26

new Foo()を実行すると、最初にoperator newが呼び出されてメモリが割り当てられ、Fooのコンストラクタが呼び出されます。そのコンストラクタがスローすると、既に割り当てられているメモリにアクセスできないので、C++ランタイムは適切なoperator deleteに渡して処理します。そのため、あなたが書いたoperator newごとに必ず一致するoperator deleteを実装する必要があります。そのため、アクセス可能にする必要があります。

いずれの方法も非公開にして、operator newを公開メンバー関数(create()など)から呼び出すことができます。

3

チェックthis。下の段落の1つでは、新規にアクセス可能にするには削除が必要であると言われています。基本的に、ヒープ上にオブジェクトを作成できるのは、それらを再度削除することができる場合だけです。

2

C++標準に従って、ダイナミックメモリ割り当てを使用するクラスがあり、コンストラクタ内で例外が発生すると、メモリリークを回避するためにメモリを解放する必要があります。

ここでは、新しい演算子をpublicとして定義していますが、deleteはprivateです。

コンパイラが私に演算子を削除するように指示するので、 はコンストラクタで例外が発生した場合にメモリリークを防ぐことができます。

delete演算子を定義しないと、コンパイラもエラーを出し、それを定義しなければなりません。

1
  • "1.エラーの原因は何ですか?

    sbiの回答が良いです。

  • "2.メンバーCreateInstance関数に頼らずに問題を解決できますか?"

    はい。プライベートデストラクタを作成します。

+0

2の問題。クラスを継承することができ、デストラクタを誤ってpublicとして再定義することができるということです。 – Marius

+0

プライベート・デストラクターを持つクラスは継承できません。 –

関連する問題