У меня есть два класса 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
основана на локальной переменной g_
в классе MaxFlow
, когда Я создаю новый объект maxFlowObj
в MinMaxFlow
, вызывающий maxFlowObj.maxFlowAlgo()
будет использовать свои собственные данные, что делает результат непредсказуемым. Итак, мой вопрос: как я могу использовать метод (например, maxFlowAlgo
) относится к MaxFlow
во втором классе MinMaxFlow
, если метод использует локальные переменные в MaxFlow
?
Обновление: Я выяснил, проблема в 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' внутри вашего цикла. Возможно, этот край предназначен для удаления в начале итерации и добавлен в конце? –