【问题标题】:C++ - Implement Merging of graph nodes using Dereference operator overloadingC++ - 使用取消引用运算符重载实现图形节点的合并
【发布时间】:2016-03-19 19:40:31
【问题描述】:

我必须使用离散图。对我来说,一个特殊的过程是找到图的强连通分量。之后我必须合并等效节点。也就是说,如果有以下节点:- node1、node2、node3 等。最终我需要能够合并其中的一些。例如,如果 node1 是领导者,则 node2、node3 最终应该指向 node1。因此,如果访问 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

【问题讨论】:

    标签: c++ graph operator-overloading


    【解决方案1】:

    我在这里做错了。无法为原始指针重载取消引用运算符。它可以为新定义的类重载。因此,在这种情况下,最好为指向类的指针使用包装器而不是原始指针。

    这是修改后的代码,它可以正常工作并完成我在上述问题中想做的事情:-

    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();
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多