2011-07-14 22 views
0

私の質問のコードはhttp://matthewh.me/Scripts/c++/graphs/にあります。ユーザー名はゲストパスワードguestです。これにより、svnリポジトリへの読み取りアクセス権が与えられます。私はこのポストを読んでいる間あなたの目を救うためにこれを行います。演算子のオーバーロード== C++

私の質問には、これは、クラスの==演算子のオーバーロードに関するものです。私が持っているコードは動作していないようですが、私はそれをどのように解釈しているのかによって、(私はもっと謙虚になり、コンパイラの言うことを受け入れる必要があります)以下は、それにつながるコードセグメントの連鎖である限り、動作していないコードの部分です。

template<typename S,typename T> 
template<typename U,typename V> 
bool Graph<S,T>::Node<U,V>::operator== (Node<S,T> *comp) { 
    cout << "Searching for"; 
    comp->print_self(); 
    bool ret = false; 
    if(this->key == comp->key && this->value == comp->value) { 
     ret = true; 
    } 
    return ret; 
} 

重複するノードを挿入しないようにグラフを作成する場合に使用します。ノードクラスとグラフクラスは、リポジトリのコードにあります。続けるには、これが呼び出される場所につながるブロックの連鎖があります。

まず私のドライバー:

template<typename S,typename T> 
void Graph<S,T>::insert_adjacents(pair<S,T> *from, pair<S,T> *to) { 
Node<S,T> *from_node = new Node<S,T>(from->first, from->second); 
Node<S,T> *to_node = new Node<S,T>(to->first, to->second); 

Node<S,T> *from_tmp = this->contains_already(from_node); 
Node<S,T> *to_tmp = this->contains_already(to_node); 

if(from_tmp==NULL) { 
    this->nodes.push_back(from_node); 
    from_tmp = from_node; 
} 
if(to_tmp==NULL) { 
    this->nodes.push_back(to_node); 
    to_tmp = to_node; 
} 

Node<S,T> *from_edge = from_tmp->contains_adjacent_node(to_tmp); 
Node<S,T> *to_edge = to_tmp->contains_adjacent_node(from_tmp); 

if(from_edge==NULL) { 
    from_tmp->insert_adjacent_node(to_node,rand()%20); 
} 
if(to_edge==NULL) { 
    to_tmp->insert_adjacent_node(from_node,rand()%20); 
} 

}

今すぐ両方のグラフのための機能が含まれています

int main(int argc, char **argv) { 
    Graph<int, int> graph; 
    pair<int,int> p1(3,4); 
    pair<int,int> p2(3,4); 

    graph.insert_adjacents(&p1,&p2); 

    graph.print_graph(); 

    //graph.print_nodes(); 
} 

挿入機能は、(ここではメモリリークではない懸念の気圧があります)ノード:

template<typename S,typename T> 
Graph<S,T>::Node<S,T>* Graph<S,T>::contains_already(Node<S,T> *check) { 
    cout << "Searching for Node "; 
    check->print_self(); 
    cout << " in node list" << endl; 
     typename list<Node<S,T>* >::iterator start = nodes.begin(); 
     typename list<Node<S,T>* >::iterator end = nodes.end(); 
     while(start != end) { 
       if(*(start) == check) { 
      cout << "Found "; 
      (*start)->print_self(); 
      cout << endl; 
         return (*start); 
       } 
       start++; 
     } 
     return NULL; 
} 

および

template<typename S,typename T> 
template<typename U,typename V> 
Graph<S,T>::Node<S,T>* Graph<S,T>::Node<U,V>::contains_adjacent_node(Node<S,T> *adj) { 
    cout << "Checking for adjacent node "; 
    adj->print_self(); 
    cout << " next to "; 
    this->print_self(); 
    cout << endl; 
    typename list<Edge*>::iterator start = adj->adjacents.begin(); 
    typename list<Edge*>::iterator end = adj->adjacents.end(); 
    while(start != end) { 
     if((*start)->adjacent == adj) { 
      return (*start)->adjacent; 
     } 
     start++; 
    } 
    return NULL; 
} 

どちらのノードも、2つのノードが同じかどうかを比較するために==演算子を使用します。私はこの作業をするためにポインタを尊重する必要がありますか?

知っている人がかなりいることを知っています。若いC++開発者がその方法を学ぶのを助けてください。

は、ありがとう マシューHoggan


UPDATE

私は抵抗することができませんでしたし、妻は少し遅いされているので、私がしようとすると、我々は左の前にそれを修正することを決めました。とにかく、更新された2つのコードは次のとおりですが、まだ動作していないようです。今、この時点で何か助けていただければ幸いです。もちろん

template<typename S,typename T> 
template<typename U,typename V> 
bool Graph<S,T>::Node<U,V>::operator== (Node<S,T> &comp) const { 
     cout << "Searching for"; 
     comp.print_self(); 
     bool ret = false; 
     if(this->key == comp.key && this->value == comp.value) { 
       ret = true; 
     } 
     return ret; 
} 

template<typename S,typename T> 
template<typename U,typename V> 
Graph<S,T>::Node<S,T>* Graph<S,T>::Node<U,V>::contains_adjacent_node(Node<S,T> *adj) { 
     cout << "Checking for adjacent node "; 
     adj->print_self(); 
     cout << " next to "; 
     this->print_self(); 
     cout << endl; 
     typename list<Edge*>::iterator start = adj->adjacents.begin(); 
     typename list<Edge*>::iterator end = adj->adjacents.end(); 
     while(start != end) { 
       if((*(*start)->adjacent) == (*adj)) { 
         return (*start)->adjacent; 
       } 
       start++; 
     } 
     return NULL; 
} 

template<typename S,typename T> 
Graph<S,T>::Node<S,T>* Graph<S,T>::contains_already(Node<S,T> *check) { 
     cout << "Searching for Node "; 
     check->print_self(); 
     cout << " in node list" << endl; 
     typename list<Node<S,T>* >::iterator start = nodes.begin(); 
     typename list<Node<S,T>* >::iterator end = nodes.end(); 
     while(start != end) { 
       if((*(*(start))) == (*check)) { 
         cout << "Found "; 
         (*start)->print_self(); 
         cout << endl; 
         return (*start); 
       } 
       start++; 
     } 
     return NULL; 
} 
+1

ポインタを逆参照することが発生しているので、どうしたらよいのでしょうか?事実の後であなたに明白でないなら、あなたはそれがなぜその方法であるかを尋ねることができます。 –

+0

「動作していない」とは何かを知るのに役立ちます。多分それは働いていますが、あなたが期待していたことをしていないでしょうか?データが何であるか、コードが何を期待しているのか、実際に何が起こるのかを例に挙げてみましょう。 – littleadv

答えて

1

あなたべきポインタを間接参照。このコードで

(*start)->adjacent == adj 

あなたはポインタを比較している(adjacentadjの両方があなたのクラスオブジェクトへのポインタであると仮定)は、あなたのオペレータは全く呼び出されません。

はところで:私はいつもすなわち、あなたがoperator==pass referenceことになっていると思った:それは次のようになります。

bool Graph<S,T>::Node<U,V>::operator== (const Node<S,T> &comp) const 

代わりにあなたが持っているもので。

+3

比較演算子は、以下のようにする必要があります: 'bool Graph ::ノード :: operator ==(constノード&comp)const' - const参照を取るconstメソッドです。 – Chad

+0

これを正午以降に変更しようとします。それは正しいと思われますが、これを答えとしてマークする前に確認したいと思います。 1時間後に妻を病院に連れて行って、物事を準備する必要があります。 –

+1

@Chad - あなたは比較演算子を意味しました、割り当ては 'const'であってはいけません:-)はい、あなたは正しいですが、それは手元の問題ではありません。 – littleadv

関連する問題