ダミーパラメーターを使用するC ++クラスメンバー関数
-
06-07-2019 - |
質問
ダミーの" int"を使用できることを知っています。 operator ++
および operator-
のパラメーターを使用して、これらの演算子の接尾辞バージョンをオーバーライドしますが、デストラクタで宣言できるダミーパラメーターについては漠然と思い出します。誰もがそれについて何か知っていますか?もしそうなら、そのダミーパラメータは何をしましたか?
これは私の古いTurbo C ++チュートリアル本にありました。私は10代の頃(つまり、ずっと前)に読んでいたので、完全に覚えていないかもしれません。それは標準化される前の非常に初期のC ++でもあったため、Turbo C ++固有のものであった可能性があります。
解決
あなたはおそらく、署名を持つ配置とnothrow形式の演算子削除を考えています:
void operator delete(void *, void *) throw();
void operator delete(void *, const std::nothrow_t&) throw();
void operator delete[](void *, void *) throw();
void operator delete[](void *, const std::nothrow_t&) throw();
これらは通常の操作中に呼び出されることはありませんが、 placement new は例外をスローします。コンパイラはすでにデッドオブジェクトのベースとメンバーでデストラクタを呼び出しており、新しい配置のために解放するメモリがないため、通常はそれらを定義する必要はありません。ただし、新しいプレースメントをオーバーロードしており、対応する演算子が必要な場合に存在できます。
2番目の引数は実際には使用されず、通常の署名を区別するだけです:
void operator delete(void *)
これらはoperator ++のように特別な仮引数ではありません。これらは、次のような追加の引数を使用してnewを呼び出す一般規則の単なるインスタンスです。
obj = new(x,y,z) Object(a,b,c)
暗黙のコードを生成して、同じ追加の引数を演算子deleteに渡すコンストラクタエラーからクリーンアップします。これは(ほぼ)次のように機能します。
void *raw = operator new(sizeof(Object), x,y,z)
try {
obj = new(raw) Object(a,b,c);
} catch(...) {
operator delete(raw,x,y,z);
throw;
}
他のヒント
覚えていないか、忘れてみてください。デストラクタにはパラメータや戻り値の型がないため、例外をスローするべきではありません。
同じことを聞いたことは確かですが、 C ++ FAQには、そのようなフォームは存在しないと言われているようです。
おそらく新しい配置を考えていますか?
class MyClass { /* ... */ };
char * raw_mem = new char [sizeof (MyClass)];
pMyClass = new (raw_mem) MyClass;
// ...
pMyClass-->(~MyClass());
delete[] raw_mem;
あなたは狂っていない。前にデストラクタでintパラメータを見たことは間違いありません。 OpenVMSでHPのコンパイラを使用して、以下に示すサンプルプログラムをコンパイルしました。シンボルのリストには、intパラメーターを持つデストラクタが含まれています。これはコンパイラ固有のものだと推測できます。
$ create foo.cxx
class foo
{
~foo() {}
};
$ cxx foo.cxx
$ type [.CXX_REPOSITORY]cxx$demangler_db.
CX3あなたは狂っていない。前にデストラクタでintパラメータを見たことは間違いありません。 OpenVMSでHPのコンパイラを使用して、以下に示すサンプルプログラムをコンパイルしました。シンボルのリストには、intパラメーターを持つデストラクタが含まれています。これはコンパイラ固有のものだと推測できます。
<*>ZN3FOOD1EV31GNTHJ foo::$complete$~foo()
CX3あなたは狂っていない。前にデストラクタでintパラメータを見たことは間違いありません。 OpenVMSでHPのコンパイラを使用して、以下に示すサンプルプログラムをコンパイルしました。シンボルのリストには、intパラメーターを持つデストラクタが含まれています。これはコンパイラ固有のものだと推測できます。
<*>ZN3FOOD2EV30KQI3A foo::$subobject$~foo()
CX3あなたは狂っていない。前にデストラクタでintパラメータを見たことは間違いありません。 OpenVMSでHPのコンパイラを使用して、以下に示すサンプルプログラムをコンパイルしました。シンボルのリストには、intパラメーターを持つデストラクタが含まれています。これはコンパイラ固有のものだと推測できます。
<*>ZN3FOOD9EV36HH9SB foo::~foo(int)
CXXLあなたは狂っていない。前にデストラクタでintパラメータを見たことは間違いありません。 OpenVMSでHPのコンパイラを使用して、以下に示すサンプルプログラムをコンパイルしました。シンボルのリストには、intパラメーターを持つデストラクタが含まれています。これはコンパイラ固有のものだと推測できます。
<*>ZDLPV void operator delete(void *)