Как вызвать функцию из другого класса, где функция использует локальную переменную

У меня два класса MaxFlow а также MinMaxFlow,

MaxFlow использует Boost Graph для создания графа из топологии сети:

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

1

Решение

В этом случае все в порядке, что пограничные мощности изменены.

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

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

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

1

Другие решения

Кажется, вы спросили XY Проблема.

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

0

По вопросам рекламы [email protected]