1

クラスのインスタンスへのポインタを引数として受け入れる関数を作成し、それを削除したいと思います。問題は、何を削除するのか事前にわからないことです。基本的に私が必要とするのは次のようなものです:

void Foo(pointer* generic_pointer){
  //Some code here
  delete generic_pointer;
  //Some more code here
}

void *を使用することを考えましたが、それは明らかに非常に悪いコーディングであり、混乱を招きます。

注:基本的にループであるオブジェクトがあり、それが終了したら、ループでもある別のオブジェクト(異なるクラスの)を作成してから、元のオブジェクトを削除する必要があります。これを削除すると、目的のループを開始できなかったので、2番目のオブジェクトから削除できると思いましたが、どの種類のオブジェクトからも開始できる可能性があるため、これが考えられる唯一のことです。それを行う方法に関する他の提案はありますか?

4

5 に答える 5

2

これは不可能です。オペレーターは、データのdeleteタイプを使用して、呼び出されるデストラクタを推測します。タイプがである場合void*、それは賢明なものを推測することはできません。代わりに、スマートポインタのトピックを調べることをお勧めします。

于 2013-02-28T11:21:32.353 に答える
1

それは非常に悪いことです。キャストしvoid*て渡すと、すべての型情報が失われ、プログラムのコンパイルよりも速くundefinedbehaviorlandになります。

昔ながらの方法でそれを実行し、を呼び出しますdeleteFoo(something)電話をかけることに利点はありませんdelete something

于 2013-02-28T11:20:18.033 に答える
0

すでに述べたように、スマートポインタ。あなたの代わりにスマートポインタにメモリを管理させましょう。あなた自身のスマートポインタを実装してみてください(教育目的のあなただけのために)。インターネットでは、さまざまなアイデアや実装を見つけることができます。

PS

void *を使用することを考えましたが、それは明らかに非常に悪いコーディングであり、混乱を招きます。

あなたは十字軍のように聞こえます)))C++には白黒だけではありません。単に何かを間違って使用する可能性はたくさんあります。実際、エレガントに見せるためにvoid *を使用して実際に実装する必要があるものがいくつかあります。実装では、それらをユーザーから非表示にする必要があります。

于 2013-02-28T11:56:40.217 に答える
-1

テンプレート?

template<typename T>
void Foo<T>(T* p) {
  delete p;
}
于 2013-02-28T11:19:43.640 に答える
-1

テンプレートを使用してこれを実現できます

template <class T>
void Foo(T* pointer){
//do your stuff
delete T;
}

もちろん、これはすべての場合に機能するとは限りません。

ここを参照してください。

于 2013-02-28T11:21:23.557 に答える