我有两个类MaxFlow
和MinMaxFlow
。如何从另一个类调用函数,其中函数使用局部变量
MaxFlow
使用升压图从网络拓扑创建一个图表:
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_
因为我们只需要一个实例来这里做所有的工作。 MinMaxFlow
遍历图中每个边找到一个最低的最高流量,如果我们不能在该edge
(设置容量为0):
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;
}
}
现在的问题是,maxFlowAlgo
在MaxFlow
类,当基于本地变量g_
我在MinMaxFlow
中创建新对象maxFlowObj
,调用maxFlowObj.maxFlowAlgo()
将使用自己的数据,这使得结果不可预知。 所以我的问题是:如果该方法使用MaxFlow
中的局部变量,如何使用方法(如maxFlowAlgo
)属于MaxFlow
在第二类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'变量。也许,这个边缘是打算在迭代开始时被删除,并在最后添加? –