2009-05-07 10 views
0

私はクラスグラフの演算子オーバーロードを" - "にしました。それは、直感的な完全 (悪いコーディング-Iは知っている)ではありませんが、私はgraph3 = graph2-グラフ1をすれば、グラフ3は だから、両方のグラフでのみ頂点2とグラフ1C++オーバーロード `-`

を受けることになっているI使用ですコードを書いたときに、私がデバッガを実行すると、オペレータ関数は新しい "グラフ"を作成して返すように見え、適切な頂点を新しいグラフ に追加してから、デバッガはオペレーションを終了するようです決してそれを mainに戻さないでください。それは私が何かを入力するのを待っているかのようです。 エラーメッセージは表示されません。

char stringy[100]; 
//cin>>stringy; 
strcpy(stringy,"|12,34,25,2,3,2|(3->2),(2->1),(5->9),(2->1)|"); 
char* param= new char[sizeof(stringy)]; 
strcpy(param,stringy); 
Graph graph1(param); 

char sstring[20] = "|33,34,11|(2->33)|"; 
Graph graph2(sstring); 
cout<<graph2.outSumm()<<endl; 

Graph graph3; 
//until here everything works fine 
graph3= graph1-graph2; //the debugger does this and then 

cout<<graph3.outSumm()<<endl; 

operator-機能:

Graph Graph::operator- (const Graph& g2) const 
{ 
Graph created; 

//goes through "this" list and if value exists in g2 copies it to created 
for(int i=0;i<vertList.getSize();i++) 
{ 
if (g2.vertList.find(vertList.read(i))!=999) 
created.addVertex(vertList.read(i).getInt()); 
} 

return created; 
} 

私はコードブロックを使用しています。ここ

はコードです。

コピーコンストラクタ:

Graph(const Graph& g2):  
maxVal(g2.maxVal),vertList(g2.vertList),edgeList(g2.edgeList){} ; 

代入演算子:(それはあるかもしれないが)

void Graph::operator= (const Graph& g2) 
{ 
if (this==&g2) 
{ 
cout<<"not the greatest idea"<<endl; 
return; 
} 

vertList.delete_List(); 
edgeList.delete_List(); 
maxVal=0; 

addValues(g2.outSumm()); 
} 
+3

なぜこれらのchar配列を使用していますか?なぜstd :: stringを使わないのですか? –

+3

代入演算子とコピーコンストラクタも共有できますか?コードは、それらのいずれかにぶら下がっている可能性があります。 – ephemient

+2

"私はgraph3 = graph2-graph1を使うと、グラフ3はグラフ2とグラフ1の両方の頂点だけを受け取るはずです。 グラフ3はグラフ2とグラフ1の両方に頂点しか持たないので、&&(許可されています)をオーバーロードする方が理にかなっていませんか? –

答えて

2

特に、あなたの質問に関連していない、なぜあなたがのstd ::文字列を使用していませんか?そして、あなたは文字配列を使用する必要がある場合は、なぜ:

char stringy[100] = "|12,34,25,2,3,2|(3->2),(2->1),(5->9),(2->1)|"; 
Graph graph1(stringy); 

かさえ:

Graph graph1("|12,34,25,2,3,2|(3->2),(2->1),(5->9),(2->1)|"); 

それとも、あなたのクラスのコンストラクタに渡されたポインタを格納しているの?もしそうなら、それは良い考えではなく、std :: stringsを使うという私のアドバイスは二重になります。

2

あなたのコードのようなサウンドは無限ループです。プログラムが停止しているように見えるときにデバッガを中断しようとしましたか?

Graphクラスにコピーコンストラクタが定義されていますか?変数createdを使用して値を正常に返すには、この値が必要です。代わりにoperator-実装するので

+0

デバッガを中断してどういう意味ですか? – Meir

+0

@Meir:プログラムを終了せずに、デバッガを使用して実行を一時的に停止することを意味しました。 (これにより、ブレークポイントに達したかのように、スタック、変数などを調べることができます)。 –

0

、=の代わりにoperator-実装:

Graph& Graph::operator-=(const Graph& rhs) 
{ 
    // remove nodes not in both Graphs 

    return *this; 
} 

をそれからちょうどその面でoperator-実装:これが動作するかどうか

Graph Graph::operator-(const Graph& rhs) 
{ 
    Graph temp(*this); 
    temp -= rhs; 
    return temp; 
} 

を参照してください。

+0

- =のユースケースがありますか、本が良いアイディアだと言っているので、追加していますか?ユースケースがうまくいけば(次に、 - =という意味での定義は良いアイデアですが)、演算子を追加するのは悪い考えであるからです。必要なものだけを実装してください! –

+0

ケースが実際の操作から割当を分割しています。さらに、オペレータに過負荷をかけようとしている場合は、それを正しく行う方がよいでしょう。個人的には、私はオペレータが過負荷になる理由は全く見当たりませんが、この操作は依然として似ていると思われます。 – rlbond

+0

あなたは正しいことをしようとしているなら私は同意します。しかし、それはあなたの例の議論ではありません。それを行う前に、ユースケースを分析して、ユースケースが有効なユースケースであるかどうかを確認する必要があります。このような状況では、 - =のユースケースは存在せず、したがって、おそらく無駄な努力と未使用のコードになるでしょう。注:何かは、それが正当であると主張するために使用される文脈においてのみ正しいものであり、まずその存在を正当化しなければならない。 –

関連する問題