1

次の問題があります。C++ で実行する必要があるプログラムで C ライブラリ igraph (http://igraph.sourceforge.net/) を使用しています。そこで、この C ライブラリ (http://code.google.com/p/igraphhpp/) の C++ ラッパーを見つけました。これは、Graph というクラスで、使用したいと思っていた優れたインターフェイスを提供します。

プログラムに次のクラスがあります。

class Agent 
{
private: 
  double beta;  
  Graph * innerGraph;
public:
  Agent(int N, double beta_) {
    innerGraph = new Graph;
    *innerGraph = Graph::full(N);
    beta = beta_;
  };
  ~Agent() {delete innerGraph;}
  void MCStep();
};

関数 MCStep() は、次のことを行う必要があります。

  • に含まれるグラフのコピーを作成し*innerGraph
  • オリジナルを変更せずに、このコピーに何らかの操作を行い、
  • 変更されたコピーが何らかの条件を満たしているかどうかを確認し、そうであれば、*innerGraphこの新しい変更されたグラフで更新します。

ライブラリがセーフ コピー コンストラクターを実装していることを知っていれば、当然のことですが、そうしません。どうすれば確認できますか?

4

2 に答える 2

2

Graph のソースを確認し、コピー コンストラクターがこの関数を呼び出しているかどうかを確認します。

http://igraph.sourceforge.net/doc/html/ch04s02s01.html#igraph_copy

一般的な方法はありません。C++ 言語自体は「ディープ コピー」または「シャロー コピー」について何も知らないため、それに関する限り、コピー コンストラクターはすべて同じです。理想的な世界では、このような C++ ラッパーを発行する人は誰でもそれを文書化するでしょう。この場合、おそらく完全なディープ コピーを作成する必要があります。

于 2010-11-26T17:46:01.080 に答える
1

グラフへのポインターを使用しているので、ステップ3でポインターを交換するだけではいけませんか?(スワップ後の一時的なものを削除することを忘れないでください)

于 2010-11-26T17:26:01.437 に答える