私の質問のコードは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++開発者がその方法を学ぶのを助けてください。
は、ありがとう マシューHogganUPDATE
私は抵抗することができませんでしたし、妻は少し遅いされているので、私がしようとすると、我々は左の前にそれを修正することを決めました。とにかく、更新された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;
}
ポインタを逆参照することが発生しているので、どうしたらよいのでしょうか?事実の後であなたに明白でないなら、あなたはそれがなぜその方法であるかを尋ねることができます。 –
「動作していない」とは何かを知るのに役立ちます。多分それは働いていますが、あなたが期待していたことをしていないでしょうか?データが何であるか、コードが何を期待しているのか、実際に何が起こるのかを例に挙げてみましょう。 – littleadv