Ich habe Probleme mit dem Speichern von Zeigern zu Adressen für Stack zugeordneten Objekten in Vektoren. Irgendwie scheinen die Zeiger einander auf eine Weise zu überschreiben, die ich nicht verstehe.Speichern der Adresse zu Stack zugeordneten Objekt in Vektor
In meiner Hauptsache möchte ich aus einer Datei lesen, Knoten (Stapel zugeordnet) erstellen und sie in einen Vektor einfügen. Später lese ich weiter aus der Datei, um Verbindungen (Edges) zwischen den Knoten zu erstellen und staple somit Edge-Objekte zu und versuche, die Adressen zu diesen im jeweiligen Knoten zu speichern (Knoten enthalten einen Vektor). Die Eingabedatei hat das Format index_1 a, index_2, b, Kapazität c, was bedeutet, dass eine Kante von a nach b und umgekehrt mit der Kapazität c erstellt werden soll.
Jedes Mal, wenn ich einem Knoten eine Kante (vector :: push_back()) hinzufüge, wird der gesamte Vektor im Knoten auf den gleichen Zeiger gesetzt (anstatt nur einen anderen Zeiger wie vorgesehen anzuhängen). Beispiel Ausgabe nach der Zugabe von 3 Kanten zum gleichen Knoten:
#0 named: ORIGINS connected to:
#1 named: 2, capacity: -1, flow: 0
#0 named: ORIGINS connected to:
#17 named: 3W, capacity: -1, flow: 0
#17 named: 3W, capacity: -1, flow: 0
#0 named: ORIGINS connected to:
#16 named: 3E, capacity: -1, flow: 0
#16 named: 3E, capacity: -1, flow: 0
#16 named: 3E, capacity: -1, flow: 0
Excuse meines Code, wenn es irgendwelche Tests oder Druck in ihm links:
Main:
Edge.cpp:
#include "Edge.h"
Edge::Edge() : endNode(nullptr), capacity(0), flow(0) {};
Edge::Edge(Node* n, int c, int f) : endNode(n), capacity(c), flow(f) {};
Edge::Edge(const Edge& other) {
endNode = other.endNode;
capacity = other.capacity;
flow = other.flow;
};
bool Edge::pushFlow(int f) {
if (flow + f <= capacity) {
flow += f;
return true;
} else {
return false;
}
}
bool Edge::popFlow(int f) {
if (flow - f >= 0) {
flow -= f;
return true;
} else {
return false;
}
}
Node* Edge::getEndNode() {
return endNode;
}
int Edge::getCapacity() {
return capacity;
}
int Edge::getFlow() {
return flow;
}
Node.cpp:
#include "Node.h"
#include <iostream>
Node::Node() : name(""), index(-1) {};
Node::Node(std::string n, int i) : name(n), index(i) {};
Node::Node(const Node& other) : name(other.name), index(other.index), edges(other.edges) {};
void Node::addEdge(Edge* e) {
edges.push_back(e);
}
std::vector<Edge*> Node::getEdges() {
return edges;
}
Node& Node::operator=(const Node& rhs) {
if (this == &rhs) return *this;
name = rhs.name;
index = rhs.index;
edges = rhs.edges;
return *this;
}
std::string Node::getName() {
return name;
}
int Node::getIndex() {
return index;
}
Vielen Dank für jede Hilfe oder Zeiger (er he)!
Stapel zugewiesene Instanzen werden zerstört, sobald sie den Gültigkeitsbereich verlassen, daher ist es sicherlich keine gute Idee, ihre Adressen weiter außerhalb dieses Bereichs zu verwenden. –
Bei zukünftigen Fragen reduzieren Sie bitte Ihren Code auf ein ** minimales, aber vollständiges Beispiel **, das Leser ausprobieren können. –
Angenommen, der Sportwagen Ihrer Träume ist in 1428, Elm Street geparkt. Am nächsten Tag triffst du einen guten Freund und du sagst "Geh zu 1428, Elm Street und sieh dir mein Traumauto an". Er kommt zurück und sagt: "Warum träumst du von einem Müllwagen? Du brauchst Hilfe". Verstehst du, wie das passieren könnte? – molbdnilo