2016-03-19 13 views
0

Ayrık grafiklerle çalışmam gerekiyor. Ve benim için özel bir prosedür, grafiğin güçlü bir şekilde bağlı bileşenlerini bulmaktır. Bundan sonra eşdeğer düğümleri birleştirmem gerekiyor. Yani, eğer aşağıdaki düğümler varsa: - node1, node2, node3, vs. Sonunda bunlardan birkaçını birleştirebilmem gerekir. Örneğin, node1 bir lider ise, node2, node3 nihayet nod1'e işaret etmelidir. Böylece, eğer node2'ye erişilirse, bunun yerine node1'e erişmeliyiz. (her durumda eşdeğerdir).C++ - Uygula Dereference operatörünün aşırı yüklenmesi ile grafik düğümlerinin birleştirilmesi

Kullandığım kaba bir fikir, her düğümde bir düğüm liderine işaretçi kullanmaktı. Başlangıçta kendisine işaret eder, ancak sonunda bir lidere işaret edebilir. Ve bundan sonra, eğer düğüme erişilirse, lidere ulaşırız. (bu yaklaşım benim istediğim şeye yol açmayabilir, ama ben sadece olasılıkları düşünüyordum). Yani burada

C++ temel bir düğüm yapıdır: - Ben düzgün İstediğimi elde etmek ben KQUEUE operatörünü aşırı gerektiğini bilmek istiyorum: -

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

Ama aşırı yüklenmesini yapıyorum düşünüyorum yanlış, ben çıkışından beklediğiniz alamadım olarak: -

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


} 

Çıktı: -

ptr1 data :- 
1 
ptr2 data :- 
2 
changing Leader for ptr1 
ptr1 data :- 
1 
ptr2 data :- 
2 

cevap

0

Burada yanlış yapıyorum. Dereference operatörü bir ham işaretçi için aşırı yüklenemedi. Yeni tanımlanmış bir sınıf için aşırı yüklenebilir. Bu nedenle, bu tür durumlarda, bir ham işaretçi yerine sınıfa bir işaretçi için bir sarıcı kullanmak daha iyidir. İşte

çalışır ve yukarıda söz konusu yapmak istediğini yapar modifiye kod: -

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


}