Hao*_*ang 5 c++ oop graph c++11
我现在正在设计我自己的带有邻接列表的图形类.除了析构函数之外,我完成了大部分步骤.
这是我的Vertex类:
struct Vertex{
public:
Vertex(){m_name="";}
Vertex(string name):m_name(name){}
~Vertex(){
cout << "vertex des" << endl;
for(int i = 0; i < m_edge.size(); i++){
delete m_edge[i];
m_edge[i] = nullptr;
}
}
string m_name;
vector<Edge*> m_edge;
};
Run Code Online (Sandbox Code Playgroud)
这是我的Edge类:
struct Edge{
public:
Edge() : m_head(nullptr), m_tail(nullptr) {m_name="";}
Edge(string name) : m_name(name), m_head(nullptr), m_tail(nullptr) {}
~Edge(){
cout << "Edge des" << endl;
delete m_head;
m_head = nullptr;
delete m_tail;
m_tail = nullptr;
}
string m_name;
Vertex* m_head;
Vertex* m_tail;
};
Run Code Online (Sandbox Code Playgroud)
但是,我注意到在调用析构函数时,两个类实际上都调用了彼此的析构函数,因此这给了我一个无限循环.这个设计有问题吗?如果没有,有没有办法解决这个析构函数问题?谢谢!
但是,我注意到当调用析构函数时,两个类实际上都调用彼此的析构函数,因此这给了我一个无限循环。这样的设计有问题吗?
你现在的设计确实有问题。动态分配只能由其各自所有者删除。通常,所有者是对象的创建者,并且通常只有一个所有者。如果有多个对象,则所有权是共享的。共享所有权需要一种机制(例如引用计数)来跟踪当前所有者的数量。
从析构函数来看,您的顶点似乎由多个边“拥有”,并且这些边似乎由多个顶点拥有。如果不是这样,那么你的图表就会很无聊。但您尚未实施任何形式的所有权跟踪。
我建议使用更简单的设计,其中边不拥有顶点,顶点也不拥有边。它们都应该由一个可能称为 的父对象拥有Graph。