C++ - 使用取消引用运算符重载实现图形节点的合并

C++ - Implement Merging of graph nodes using Dereference operator overloading

本文关键字:图形 实现 节点 合并 重载 运算符 取消 引用 C++      更新时间:2023-10-16

我必须使用离散图。对我来说,一个特殊的过程是找到图中强连接的组件。之后,我必须合并等效的节点。也就是说,如果有以下节点:- 节点 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();

}