如何访问链接列表的私有向量

时间:2013-12-20 13:17:05

标签: c++ list class object vector

[A,0]->[B,3]
[B,0]->[A,3]

这是我计划使用的数据结构,其中Y coord是向量而x coord是列表。列表中的每个节点都包含一个字符串和一个整数(如上所示)。让我假装这是包含链表向量声明的类,把它叫做Graph,因为这是一个图形赋值... [注意这段代码不会编译,因为我勾勒出它让其他人看起来更简单读取。]

class Graph
{
public:
    Graph(){...}
    ~Graph(){...}
private:
    class Edge
    {
    public:
        Edge(string vertex, int weight)
        {
            m_vertex = vertex;
            m_weight = weight;
        }
        ~Edge(){...}
        string m_vertex;
        int m_weight;
    };
    vector< list < Edge > > adjacency_list; //the vector of linked lists
};

在一个完全不同的.h文件中,我会声明这个类:

class Modify_Graph
{
public:
    void access_Edge();
    //......
private:
    //......
};

这包含在Modify_graph.cpp文件中

void Modify_Graph::access_Edge()
{
    adjacency_list adjList;
    cout << "The very first vertex is: ";
    cout << adjList[0].front().m_vertex << endl;
}

当我编译它告诉我它找不到'adjacency_list'有没有办法得到它?在一个更复杂的程序中,我尝试通过引用传递它,返回它,以及其他东西,但它们似乎都没有用。我完全不确定该怎么做。

4 个答案:

答案 0 :(得分:2)

您需要一个Graph实例来访问adjacency_list,以及(假设它是私有的)一种用于访问该成员的方法,例如

之类的东西
vector< list < Edge > > Graph::GetAdjacencyList()
{
    return adjacency_list;
}

此外,您还需要在图表中至少Edge生成public或在Graph之外声明它。

如果你将它保存为公共内部类,那么你的函数原型将是

vector< list < Graph::Edge > > Graph::GetAdjacencyList().

然后使用该功能将起到

的作用
void Modify_Graph::access_Edge()
{
    vector< list < Graph::Edge > > adjList = m_graph.GetAdjacencyList(); //m_graph being a member of type Graph
    cout << "The very first vertex is: ";
    cout << adjList[0].front().m_vertex << endl;
}

答案 1 :(得分:1)

在oop中,以静态方式访问非静态字段不可能。 您应该提供课程Modify_Graph,引用Graph实例并为adjacency_List实现getter或其他内容。

答案 2 :(得分:0)

为什么不尝试遵循一些OOP原则(Head First: Object Oriented Analysis and Design)并使Edge类声明脱离Graph声明?

class Edge
{
public:
    Edge(string vertex, int weight)
    {
        m_vertex = vertex;
        m_weight = weight;
    }
    ~Edge(){...}
    string m_vertex;
    int m_weight;
};

class Graph
{
public:
    Graph(){...}
    ~Graph(){...}
private:
    vector< list < Edge > > adjacency_list; //the vector of linked lists
};

然后,您可以将边缘传递给访问边缘的函数,并且只有您想要修改的边缘不是整个列表。说真的,你的代码中有一些设计问题,阅读我推荐的书,你的生活会更容易。

通过这种方式,您甚至可以将Edge类重用于其他项目。

答案 3 :(得分:0)

adjacency_list,声明为私有成员,无法从实例/对象范围中看到。这意味着在调用access_edge时,该函数将无法获得甚至知道数据结构的许可。

您必须清楚OOP是关于数据所有权和访问权限的。这就是privatepublic等关键字的全部内容。要实现您的目标,您可以使用以下方法之一:

  1. 通过在行前添加public:来声明adjacency_list为公共成员。

  2. 如果您确实要隐藏数据结构,请创建允许访问数据的access_adjacency_list和modify_adjacency_list等公共访问函数。如果您需要传递列表,请传递列表的副本。

  3. 是的,你需要传递对象实例以进行访问,因为你声明列表是非静态的。