verwendet Ich habe zwei Klassen MaxFlow
und MinMaxFlow
.So rufen Sie eine Funktion aus einer anderen Klasse auf, in der die Funktion die lokale Variable
MaxFlow
verwendet Graph-Boost ein Diagramm aus einer Netzwerktopologie zu erstellen:
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_
eine lokale Variable unterhält, da wir nur eine Instanz müssen hier die ganze Arbeit zu tun. jede Kante in der Grafik MinMaxFlow
Iterierten ein Minimum max Fluss zu finden, wenn es uns nicht gelingt, dass edge
(Set-Kapazität 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;
}
}
Das Problem ist jetzt, maxFlowAlgo
basiert auf lokale Variable g_
in Klasse MaxFlow
, wenn Ich erstelle ein neues Objekt maxFlowObj
in MinMaxFlow
, Aufruf maxFlowObj.maxFlowAlgo()
wird seine eigenen Daten verwenden, die das Ergebnis unvorhersehbar macht. Also meine Frage ist: wie kann ich die Methode verwenden (wie maxFlowAlgo
) gehört zu MaxFlow
in der zweiten Klasse MinMaxFlow
, wenn die Methode lokale Variablen in MaxFlow
verwendet?
Update: Ich habe herausgefunden, das Problem ist von boost::boykov_kolmogorov_max_flow
, ich benutze Bundle-Eigenschaften und passen Sie Capacity-Eigenschaft Karte hinein, aber dieser Algorithmus wird nicht nur die Capacity-Eigenschaft Karte, sondern auch meine ursprüngliche Kante Kapazität Variable! Jetzt besteht die Problemumgehung darin, dass ich die Kapazitätswerte speichern muss, bevor ich den Algorithmus ausführe und sie danach wiederherstelle. Es soll nicht die ursprünglichen Mitglieder verändern, oder?
'g_' ist keine lokale Variable, sondern eine Variable * member *. Da ist ein Unterschied. – callyalater
Sie können Ihre Variable 'g_' statisch machen, so dass alle Instanzen Ihrer Klasse sie" teilen ". Dies kann helfen: [Statische Mitglieder] (https://msdn.microsoft.com/en-us/library/79b3xss3.aspx#Anchor_0) –
Verstehen, was lokale Variable, Klassenmitglied und Mitglied der statischen Klasse ist. Wenn Sie 'g_' einfach 'static' machen, wird Ihr Code nicht sofort korrekt. Warum gibt 'maxFlowAlgo' nach mehreren Durchläufen einen falschen Wert zurück? Ich nehme an, es sollte "const" sein. Sie verwenden keine 'edge' Variable innerhalb Ihrer Schleife. Vielleicht soll diese Kante zu Beginn der Iteration gelöscht und am Ende hinzugefügt werden? –