2016-03-19 26 views
0

我必須使用離散圖。對我來說,一個特定的過程是找到圖的強連通分量。之後我必須合併等價節點。也就是說,如果有以下節點: - node1,node2,node3等。最後,我需要能夠合併其中的幾個。例如,如果node1是領導者,那麼node2,node3應該最終指向node1。所以,如果訪問node2,我們應該訪問node1。 (無論如何它們都是等價的)。C++ - 實現使用解引用運算符重載合併圖節點

我有一個大概的想法是使用指向每個節點中的節點首長的指針。最初它指向自己,但最終它可能指向領導者。之後,如果節點被訪問,我們可以訪問領導者。 (這種方法可能不會導致我所需要的,但我只是想着可能性)。

因此,這裏是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 

回答

0

我在這裏做錯了。原始指針不能重載解引用運算符。它可能被重載用於新定義的類。因此,在這種情況下,最好使用包裝器來指向類而不是原始指針。

下面是修改後的代碼工作和做什麼,我想在上面的問題要做到: -

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


}