2016-05-29 12 views
1

Ich versuche, eine Graphklasse in C++ zu machen. Ich speichere die Kanten für jeden Knoten als Vektor der Edge-Klasse. Die Edge-Klasse verfügt über eine getWeight()-Funktion, die jedoch seltsame Werte zurückgibt.Feld von Vektor der Objekte erhalten C++

Ich denke, es hat etwas damit zu tun, Kopien der Kanten zu bekommen, anstatt die tatsächlichen Kanten, die zugewiesen wurden.

Heres der Edge-Klasse:

#ifndef EDGE_INCLUDED 
#define EDGE_INCLUDED 
#include "Node.h" 


class Node; 


class Edge { 

    private: 
     Node endpoint; 
     double weight; 

    public: 
     Edge(); 
     Edge(const Edge &edge); 
     double getWeight() const; 
     void setWeight(double weight); 
}; 
#endif // End EDGE_INCLUDED 
///////////////////////////////////////////////////////////////// 
#include "Edge.h" 
#include "Node.h" 

Edge::Edge(){} 
Edge::Edge(const Edge &edge) {} 

double Edge::getWeight() const { return this->weight; } 

void Edge::setWeight(double weight) { this->weight = weight; } 

Hier ist die Node-Klasse

#ifndef NODE_INCLUDED 
#define NODE_INCLUDED 

#include <string> 
#include <vector> 

class Edge; 

class Node { 
    private: 
     std::string label; 
     std::vector<Edge> edges; 

    public: 
     const std::string getLabel() const; 
     void setLabel(std::string label); 

     const size_t degree() const; 

     std::vector<Edge> getEdges(); 
     void setEdges(std::vector<Edge> edges); 
}; 
#endif // End NODE_INCLUDED 
///////////////////////////////////////////////////////// 
#include "Node.h" 
#include "Edge.h" 


const std::string Node::getLabel() const { return this->label; } 

void Node::setLabel(std::string label) { this->label = label; } 

const size_t Node::degree() const { return this->edges.size(); } 

std::vector<Edge> Node::getEdges() { return this->edges; } 

void Node::setEdges(std::vector<Edge> edges) { this->edges = edges; } 

Und hier ist schließlich die Haupt

#include <iostream> 
#include "Edge.h" 
#include "Node.h" 


int main() 
{ 
    Edge edge1; 
    Node node; 

    std::vector<Edge> edges; 

    edge1.setWeight(2.0); 

    edges.push_back(edge1); 

    node.setEdges(edges); 

    std::vector<Edge> e = node.getEdges(); 

    for (auto i : node.getEdges()) 
     std::cout << i.getWeight() << std::endl; 
} 

Es tut mir leid, dass ich so viel Code gepostet habe, aber ich hatte gehofft, dass jemand sehen könnte, wo ich hier falsch liege. Kann jemand meinen Fehler sehen und mich auf ein besseres Design hinweisen?

+0

Es ist alles schön und gut, aber wie wollen Sie diese Grafik benutzen? Ihre Kante hat cipies ihrer Endpunkte, und jede Endpunktkopie hat Kopien ihrer Kanten, und jede Kopie jeder Kante hat * eigene Kopien ihrer Endpunkte und ... ??? –

Antwort

1

In den Konstruktoren Edge initialisieren Sie das Element weight nicht. Daher sehen Sie nicht initialisierte Müllwerte.

sie ändern:

Edge::Edge() : weight(0.0) {} 
Edge::Edge(const Edge &edge) : weight(edge.weight) {} 
+0

Das hat funktioniert. Kannst du ein wenig mehr darüber erklären, warum 'setWeight()' 'nicht funktioniert? – noel

+0

'SetWeight' funktioniert gut. Das Problem tritt auf, wenn Kopien von 'Edge's gemacht werden, was in' node.setEdges (Kanten) geschieht; 'und in' ... e = node.getEdges(); '. –