我制作了一个可爱的通用(即模板)List
类来处理 C++ 中的列表。原因是我发现这个std::list
类对于日常使用来说非常难看,而且由于我经常使用列表,我需要一个新的。主要的改进是在我的课堂上,我可以用来[]
从中获取物品。此外,还有待实施的是IComparer
对事物进行分类的系统。
我正在使用这个List
类OBJLoader
,我的类加载 Wavefront .obj 文件并将它们转换为网格。OBJLoader
包含指向以下“类型”的指针列表:3D 位置、3D 法线、uv 纹理坐标、顶点、面和网格。顶点列表中的对象必须链接到所有 3D 位置、3D 法线和 uv 纹理坐标列表中的某些对象。面链接到顶点,网格链接到面。所以它们都是相互关联的。
为了简单起见,让我们考虑一下,在某些情况下,只有两个指针列表:List<Person*>
和List<Place*>
. Person
类包含,除其他外,字段List<Place*> placesVisited
和Place
类包含字段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 都被调用并且程序崩溃,因为它试图删除东西两次或更多次。
我的列表中的 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
课程?里面的元素可能是也可能不是指针,如果它们是指针,我希望能够在删除 myList
时指定是要删除里面的元素还是只删除Elem
它们周围的包装器。
智能指针可能是一个答案,但这意味着我不能有List<bubuType*>
,而只有List<smart_pointer_to_bubuType>
. 这可能没问题,但同样:声明 aList<bubuType*>
不会导致错误或警告,并且在某些情况下智能指针会导致实现中的一些问题:例如,我可能想List<PSTR>
为某些 WinAPI 返回声明 a。我认为让PSTR
智能指针内部的那些将是一项丑陋的工作。因此,我认为我正在寻找的解决方案应该与List
模板的释放系统有关。
有任何想法吗?