C++ - 使用取消引用运算符重载实现图形节点的合并
C++ - Implement Merging of graph nodes using Dereference operator overloading
我必须使用离散图。对我来说,一个特殊的过程是找到图中强连接的组件。之后,我必须合并等效的节点。也就是说,如果有以下节点:- 节点 1、节点 2、节点 3 等,最终我需要能够合并其中的一些。例如,如果节点 1 是领导者,节点 2、节点 3 最终应该指向节点 1。因此,如果访问了 node2,我们应该访问 node1。(无论如何,它们是等效的)。
我的一个粗略想法是在每个节点中使用指向节点领导者的指针。最初它指向自己,但最终它可能指向领导者。之后,如果节点被访问,我们就可以访问领导者。(这种方法可能不会导致我需要的,但我只是在考虑可能性)。
所以这是C++中的基本节点结构:- 我想知道我应该如何正确重载取消引用运算符以获得我想要的东西:-
class Node{
Node * leader ;
int data;
public:
Node(int x):data(x),leader(this){}
void display(void){std::cout << data << std::endl;}
void setRoot(Node * newLeader){leader = newLeader;}
Node& operator* () { return *leader; }
};
但我认为我做错了重载,因为我没有得到我期望的输出:-
main(){
Node * ptr1 = new Node(1);
Node * ptr2 = new Node(2);
std::cout << "ptr1 data :- " << std::endl ;
ptr1->display();
std::cout << "ptr2 data :- " << std::endl ;
ptr2->display();
std::cout << "changing leader for ptr1" << std::endl;
ptr1->setleader(ptr2);
std::cout << "ptr1 data :- " << std::endl ;
ptr1->display();
std::cout << "ptr2 data :- " << std::endl ;
ptr2->display();
}
输出:-
ptr1 data :-
1
ptr2 data :-
2
changing Leader for ptr1
ptr1 data :-
1
ptr2 data :-
2
我在这里做错了。不能为原始指针重载取消引用运算符。对于新定义的类,它可能被重载。因此,在这种情况下,最好使用包装器作为指向类的指针,而不是原始指针。
这是修改后的代码,它可以工作并完成我在上述问题中想要做的事情:-
class Node{
Node * leader ;
int data;
public:
Node(int x):data(x),leader(this){}
void display(void){std::cout << data << std::endl;}
void setleader(Node * newleader){leader = newleader;}
Node * getleader(void){return leader;}
};
class NodePtr{
Node * ptr;
public:
NodePtr(Node * node):ptr(node){}
Node* operator->() {
return ptr->getleader();
}
};
main(){
NodePtr ptr1( new Node(1));
NodePtr ptr2( new Node(2));
std::cout << "ptr1 data :- " << std::endl ;
ptr1->display();
std::cout << "ptr2 data :- " << std::endl ;
ptr2->display();
std::cout << "changing leader for ptr1" << std::endl;
ptr1->setleader(ptr2->getleader());
std::cout << "ptr1 data :- " << std::endl ;
ptr1->display();
std::cout << "ptr2 data :- " << std::endl ;
ptr2->display();
}
相关文章:
- 这是实现图形的坏方法吗
- 在 cpp 中最简单的图形实现
- 在C++中实现图形 DFS,指针问题
- 如何在图形中实现add_vertex和add_edge函数
- 使用深度第一次搜索的无向图中的图形调查无法实现的节点
- 我正在尝试为 Kruskal 算法实现一个C++程序,该程序需要我按权重对图形进行排序。如何按权重对结构进行排序
- 在C++中实现图形类时遇到问题
- 图形实现:变量具有初始值设定项,但类型不完整
- 图形内存实现
- 实现用于在图形中存储边缘的高效容器
- C 程序崩溃.图形实现
- C++中的图形实现
- C++ - 使用取消引用运算符重载实现图形节点的合并
- 萤火虫算法的图形实现
- 在 c++ stl 中通过邻接列表正确实现图形
- 使用 stl 的 C++ 中图形实现的比较
- 使用提升实现带有向量的图形
- 在C++中实现图形节点时将 C# 类转换为C++
- 用C++或Java实现图形
- 图形实现c++与无大小的向量