C ++不能在类的类中使用setter修改私有变量

时间:2015-05-01 12:26:27

标签: c++ class methods graph private

我知道setter函数在C ++中是基本的,但我似乎无法正确创建它。

我有一个班级Graph,其中包含另一个班级Vertex。 在main中,我实例化了Graph类型的对象,并使用该对象读取将Vertex类型的对象添加到Graph的文件。

问题在于,当我尝试打印出Graph对象时,一切似乎都是空的。我想我在滥用指针或引用。

你能解释一下为什么我有6个Vertex个对象,但它们都是空的吗? (我尝试将vector Vertex更改为vector*,但这并没有解决我的问题,我认为我丢失了Vertex个对象......)?< / p>

Main.cpp

int main(int argc, char *argv[]){
    Graph g = Graph();
    g.readDotFile("graph.dot");
    std::cout << g << std::endl;
    return 0;
}

Graph.hpp

class Graph{

private:
    class Vertex{

    public:
        Vertex();
        Vertex(std::string name);
        Vertex(Vertex const& v);
        ~Vertex();
        const std::string& getIdVertex()const;
        friend std::ostream& operator<<(std::ostream &os, Vertex const& v);
        void printVertex(std::ostream &os)const;
        void setStartToStart(const std::string& name);

    private:
        std::string idVertex;
        std::vector<std::string> startToStart;

    };

public:
    Graph();
    void readDotFile(std::string dotFile); // Graph from a dot file
    Graph(Graph const& g);
    ~Graph();
    void addVertex(Vertex& v);
    void addEdge(int typeOfEdge, std::string name1, std::string name2);
    const std::vector<Graph::Vertex>& getVertices()const;

    friend std::ostream& operator<<(std::ostream &os, Graph const& g);
    friend std::ostream& operator<<(std::ostream &os, Vertex const& v);
    void printGraph(std::ostream &os)const;
private:
    std::vector<Vertex> vertices;
};

Graph.cpp

#include "graph.hpp"  

Graph::Vertex::Vertex(){}
Graph::Vertex::Vertex(std::string name){
    idVertex = name;

}
Graph::Vertex::Vertex(Graph::Vertex const& v){}
Graph::Vertex::~Vertex(){}

const std::string& Graph::Vertex::getIdVertex()const{ return idVertex; }


void Graph::Vertex::setStartToStart(const std::string& v){
    startToStart.push_back(v);
}
Graph::Graph(){} 
Graph::Graph(Graph const& g){}   
Graph::~Graph(){}
const std::vector<Graph::Vertex>& Graph::getVertices()const{ return vertices; }

void Graph::readDotFile(std::string file){
    std::ifstream dotFileIn(file.c_str());

    std::string line;
    while (getline(dotFileIn, line)){
            // Read the file, the problem don't come from here, I just don't show the code
        addEdge(1, "origin", "destination");
        }
    }
}

void Graph::addVertex(Graph::Vertex& v){ // Before create, verify the vertex does not exist
    vertices.push_back(v);    
}

void Graph::addEdge(int typeOfEdge, std::string name1, std::string name2){
    Graph::Vertex v1 = Graph::Vertex(name1);
    addVertex(v1);
    Graph::Vertex v2 = Graph::Vertex(name2);
    addVertex(v2);
    v1.setStartToStart(name2);
}

std::ostream& operator<<(std::ostream &os, Graph const& g)
{
    g.printGraph(os);
    return os;
}

void Graph::printGraph(std::ostream &os)const{
    for (unsigned int i = 0; i < vertices.size(); ++i){
        vertices[i].printVertex(os);
    }
}

std::ostream& operator<<(std::ostream &os, Graph::Vertex const& v)
{
    v.printVertex(os);
    return os;
}

void Graph::Vertex::printVertex(std::ostream &os)const{
    os << " vertex : " << idVertex << "\t";
    for (unsigned int i = 0; i < startToStart.size(); ++i){
        os << "startToStart: " << startToStart[i] << "\t";
    }
}

}

2 个答案:

答案 0 :(得分:1)

您的Graph类定义了具有空体的构造函数,因此这些会使成员默认初始化。

main()

中的一行
Graph g = Graph();

使用默认构造函数创建默认构造的Graph(临时)。然后,它使用复制构造函数将该临时文件复制到g

默认构造函数和Graph的复制构造函数都会使对象默认初始化。

解决方案是确保所有构造函数适当地初始化它们正在创建的对象,而不是假设值将被复制。

(以上假定没有编译器优化,例如终止临时数据)。

答案 1 :(得分:0)

此处的问题是,addVertex(v1);会在您的v1成员向量中添加vertices副本,因为这是vector::push_back所做的。然后继续修改v1(原始版本),但此更改不会反映在您的成员变量上(v2相同)。您应该在addVertex功能的末尾将这两个电话移至addEdge