2016-04-13 10 views
1

У меня есть два класса 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, я использую свойства связки и передаю в нее карту свойств пропускной способности, но этот алгоритм не только изменит карту свойств мощности, но и мою первоначальную переменную емкости края! Теперь обходным путем является то, что я должен хранить значения емкости перед запуском алгоритма и восстанавливать их после него. Он не должен изменять исходных членов, не так ли?

+0

'g_' не является локальной переменной, а переменной * member *. Есть разница. – callyalater

+0

вы можете сделать свою переменную 'g_' статичной, чтобы все экземпляры вашего класса« делили »ее. это может помочь: [Статические члены] (https://msdn.microsoft.com/en-us/library/79b3xss3.aspx#Anchor_0) –

+0

Понять, что такое локальная переменная, член класса и статический член класса. Создание 'g_' просто' static' не сразу сделает ваш код правильным. Почему 'maxFlowAlgo' возвращает неправильное значение после нескольких запусков?? Полагаю, это должно быть 'const'. Вы не используете переменную 'edge' внутри вашего цикла. Возможно, этот край предназначен для удаления в начале итерации и добавлен в конце? –

ответ

0

Кажется, вы задали вопрос XY Problem.

ЕСЛИ вы хотите maintains a local variable g_ since we only need one instance, вы должны использовать Singleton Design Pattern, кроме создания экземпляра, когда вам это нужно.

1

В этом случае все изменится.

Иногда алгоритмы не изменяют входные данные. С другой стороны, лучше сохранить существующие данные для экономии ресурсов (памяти) и потому, что измененные данные могут иметь смысл. После выполнения алгоритма максимального потока предельные емкости представляют собой остаточные емкости; другими словами, сколько емкости осталось на каждом краю, когда граф насыщен потоком. По крайней мере один из ребер будет иметь нулевую остаточную емкость; когда после выполнения второго алгоритма он будет возвращать ноль, потому что граф насыщен.

Если вы хотите запустить алгоритм максимального потока несколько раз, вам нужно сохранить исходный граф и скопировать его каждый раз, когда вы запускаете алгоритм. Каждый раз в начале итерации цикла вам нужно восстановить граф или скопировать его из сохраненного.

Поскольку вы запускаете алгоритм несколько раз, вы, вероятно, захотите запустить его на разных графиках. Скорее всего, вы захотите скопировать граф и установить емкость края до нуля.

+0

Да. Я решил проблему, построив базовый граф по умолчанию. Измените его, запустите алгоритм максимального потока, восстановите его и повторите эти три шага для каждой группы ребер. Теперь он отлично работает. Еще раз спасибо за понимание. –