Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STL多重继承的remove()处理_C++_Inheritance_Memory Leaks_Stl - Fatal编程技术网

C++ STL多重继承的remove()处理

C++ STL多重继承的remove()处理,c++,inheritance,memory-leaks,stl,C++,Inheritance,Memory Leaks,Stl,我们创建了三种STL和STL继承数据类型,用于集群算法: typedef std::vector<double>Point; // A list of parameters (a single observation) struct Cluster : std::list<Point> { // A list of Points // Additional member variables Point centroid; bool centro

我们创建了三种STL和STL继承数据类型,用于集群算法:

typedef std::vector<double>Point;   // A list of parameters (a single observation)

struct Cluster : std::list<Point> {   // A list of Points
   // Additional member variables
   Point centroid;
   bool centroid_valid;
   bool sort_valid;
   // Cluster functions omitted
};

struct Universe : std::list<Cluster> {   // A list of Clusters
   // No member variables
   // Universe functions omitted
};
这是一种充分利用STL的尝试,因此没有什么是新的。问题在于从属STL功能的性质,特别是:

如果我们要从一个Universe列表中删除一个Cluster元素,STL是否不仅要处理要删除的集群中所有点的删除和内存管理,还要处理所有成员变量的删除处理

注意:所有成员函数都相对简单,没有静态操作

如果我们要从一个宇宙列表中删除一个集群元素,我们会 STL不仅处理所有数据的删除和内存管理 在集群中要删除的点,还要进行删除处理 所有成员变量

是的,因为它在集群对象上运行,删除它将删除它的所有字段。但是从标准容器继承被认为是一种不好的做法,因为它们没有虚拟析构函数。最好将集群中的点列表存储为属性。

错误:

typedef std::vector<double>Point;   // A list of parameters (a single observation)

struct Cluster : std::list<Point> {   // A list of Points
   // Additional member variables
   Point centroid;
   bool centroid_valid;
   bool sort_valid;
   // Cluster functions omitted
};
对:

typedef std::vector<double>Point;   // A list of parameters (a single observation)

struct Cluster {   // A list of Points

   std::list<Point> points;

   // Additional member variables
   Point centroid;
   bool centroid_valid;
   bool sort_valid;
   // Cluster functions omitted
};
当您从一个类继承时,您从本质上保证它的所有成员函数在针对您的类调用时都会正常运行

您的问题是“附加成员变量”是点的缓存观测值。如果删除或插入点,这些缓存的观测值将不同步,因此是错误的


如果希望集群具有与std::list相同的接口,则必须实现该接口,调用成员点并更新或将缓存的观测值标记为无效。

Yes。但是继承标准容器是个坏主意。一个宇宙有许多集群,但这并不是它的全部。这些类型的标准容器并不是真正要被继承的。这里还有另一个不继承的原因:假设将来你需要将集群的存储更改为特征矩阵,这样就可以对整个矩阵进行批处理和优化。您不希望您的接口被强制进入STL接口,而是通过适合您的数据类型:例如Cluster::AddPoint。我明白了-所以,继承的目的是利用STL的易变性,特别是删除和迭代。一般建议使用STL作为成员而不是继承来构造结构吗?谢谢-你能详细说明你的意思吗,最好将点列表作为属性存储在集群中?@Miller这意味着聚合比继承更好。