私は2つのクラスMaxFlow
とMinMaxFlow
を持っています。関数がローカル変数を使用する別のクラスから関数を呼び出す方法
MaxFlow
は、ネットワークトポロジからグラフを作成するために、ブーストグラフを使用しています。私たちはここでしかすべての作業を行うために、1つのインスタンスを必要とするので、
class MaxFlow {
public:
MaxFlow : g_() { createGraph(); } //constructor
void createGraph();
void modifyGraph(); // modify the graph to use boost maxflow algorithm
int maxFlowAlgo(); // use g_ and some other util local variables
private:
Graph g_;
... // some other helper containers created during createGraph()
}
MaxFlow
は、ローカル変数g_
を維持します。 maxFlowAlgo
は、クラスMaxFlow
、ローカル変数g_
に基づいており、
class MinMaxFlow {
public:
int getMinMaxFlow() {
int minMaxFlow = INT_MAX;
MaxFlow maxFlowObj; // create a new obj
maxFlowObj.modifyGraph(); // I suppose this modify current obj
for (auto edge : graph_edges) {
// maxFlowAlgo will return incorrect value after several runs
int maxFlowVal = maxFlowObj.maxFlowAlgo();
int minMaxFlow = std::min(minMaxFlow, maxFlowVal);
}
return minMaxFlow;
}
}
今問題がある:私たちはedge
(0に設定容量)がいることを失敗した場合 MinMaxFlow
反復し、グラフ内のすべてのエッジが最小、最大の流れを検索します新しいオブジェクトmaxFlowObj
をMinMaxFlow
に作成し、maxFlowObj.maxFlowAlgo()
を呼び出すと、独自のデータが使用され、結果が予測できなくなります。 私の質問は次のとおりです。メソッドがローカル変数MaxFlow
を使用する場合、のようなメソッド(maxFlowAlgo
のような)を第2クラスのMinMaxFlow
に含めるにはどうすればいいですか?
更新:問題はboost::boykov_kolmogorov_max_flow
です。バンドルプロパティを使用して容量プロパティマップを渡しますが、このアルゴリズムは容量プロパティマップを変更するだけでなく、オリジナルのエッジ容量の変数も変更します。これを回避するには、アルゴリズムを実行する前に容量の値を格納し、それを復元する必要があります。元のメンバーを変更する予定はありません。
'g_'はローカル変数ではなく、* member *変数です。違いがあります。 – callyalater
'g_'変数を静的にして、クラスのすべてのインスタンスがそれを"共有 "するようにすることができます。これは役立ちます:[静的メンバー](https://msdn.microsoft.com/en-us/library/79b3xss3.aspx#Anchor_0) –
ローカル変数、クラスメンバー、および静的クラスメンバーとは何かを理解してください。 'g_'を単に' static'にすることはすぐにあなたのコードを正しいものにしません。 'maxFlowAlgo'が何回も実行した後に不正な値を返すのはなぜですか?私はそれが 'const'であるべきだと思います。ループ内で 'edge'変数を使用しません。たぶん、このエッジは、反復の始めに削除され、最後に追加されることを意図していますか? –