List
C++ でリストを処理するためのかわいいジェネリック (つまりテンプレート)クラスを作成しました。その理由は、このstd::list
クラスが日常的に使用するにはひどく見苦しく、常にリストを使用しているため、新しいリストが必要だったからです。主な改善点は、私のクラスでは、 を使用[]
してそこからアイテムを取得できることです。また、まだ実装されていないのは、IComparer
物事を分類するためのシステムです。
このList
クラスはOBJLoader
、Wavefront .obj ファイルをロードしてメッシュに変換するクラスで使用しています。OBJLoader
次の「タイプ」へのポインタのリストが含まれています: 3D 位置、3D 法線、UV テクスチャ座標、頂点、面、およびメッシュ。頂点リストには、すべての 3D 位置、3D 法線、および UV テクスチャ座標リストの一部のオブジェクトにリンクする必要があるオブジェクトがあります。面は頂点にリンクし、メッシュは面にリンクします。したがって、それらはすべて相互に接続されています。
List<Person*>
簡単にするために、あるコンテキストでは、ポインターのリストがとの 2 つだけであると考えてみましょうList<Place*>
。Person
class には fieldが含まれList<Place*> placesVisited
、Place
class には field が含まれますList<Person*> peopleThatVisited
。したがって、構造は次のとおりです。
class Person
{
...
public:
Place* placeVisited;
...
};
class Place
{
...
public:
List<People*> peopleThatVisited;
};
これで、次のコードができました。
Person* psn1 = new Person();
Person* psn2 = new Person();
Place* plc1 = new Place();
Place* plc2 = new Place();
Place* plc2 = new Place();
// make some links between them here:
psn1->placesVisited.Add(plc1, plc2);
psn2->placesVisited.Add(plc2, plc3);
// add the links to the places as well
plc1->peopleThatVisited.Add(psn1);
plc2->peopleThatVisited.Add(psn1, psn2);
plc3->peopleThatVisited.Add(plc3);
// to make things worse:
List<Person*> allThePeopleAvailable;
allThePeopleAvailable.Add(psn1);
allThePeopleAvailable.Add(psn2);
List<Place*> allThePlacesAvailable;
allThePlacesAvailable.Add(plc1);
allThePlacesAvailable.Add(plc2);
allThePlacesAvailable.Add(plc3);
すべて完了。に到達するとどうなり}
ますか? すべての dtor が呼び出され、2 回以上削除しようとするため、プログラムがクラッシュします。
リストの dtor は次のようになります。
~List(void)
{
cursor = begin;
cursorPos = 0;
while(cursorPos < capacity - 1)
{
cursor = cursor->next;
cursorPos++;
delete cursor->prev;
}
delete cursor;
}
どこにElem
ある:
struct Elem
{
public:
Elem* prev;
T value;
Elem* next;
};
そしてT
ジェネリックList
タイプです。
List
クラスを安全に削除するには、どのような方法がありますか? 内部の要素はポインターである場合とそうでない場合があり、それらがポインターの場合、 my を削除するときに、内部の要素を削除するか、それらの周りのラッパーList
だけを削除するかを指定できるようにしたいと考えています。Elem
スマート ポインターが答えになる可能性がありますが、それは を持てないことを意味しますがList<bubuType*>
、List<smart_pointer_to_bubuType>
. これはList<bubuType*>
問題ないかもしれませんが、繰り返しになりますが、a を宣言してもエラーや警告は発生せず、場合によっては、スマート ポインターが実装で問題を引き起こす可能性がありList<PSTR>
ます。PSTR
それらをスマートポインターの中に入れるのは醜い仕事だと思います。したがって、私が探している解決策は、List
テンプレートの割り当て解除システムに何らかの形で関連していると思います。
何か案は?