如何访问链表的私有向量

how to access a private vector of linked lists

本文关键字:向量 链表 何访问 访问      更新时间:2023-10-16
[A,0]->[B,3]
[B,0]->[A,3]

这是我计划使用的数据结构,其中 Y 坐标是向量,x 坐标是列表。 列表中的每个节点将包含一个字符串和一个整数(如上所示)。 让我们假设这是包含链表向量声明的类,好吧,称之为 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"时,有没有办法得到它? 在一个更复杂的程序中,我尝试通过引用传递它,返回它和其他东西,但似乎都没有工作。 我完全不知道该怎么办。

你需要

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

vector< list < Edge > > Graph::GetAdjacencyList()
{
    return adjacency_list;
}

此外,您还需要在 Graph 中至少public Edge或在 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;
}

在 oop 中,无法以静态方式访问非静态字段。你应该提供类Modify_Graph,引用 Graph 实例并为adjacency_List实现一个 getter 或其他东西。

你为什么不尝试遵循一些OOP原则(Head First:面向对象的分析和设计)并从Graph声明中做出Edge类声明呢?

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 类重用于其他项目。

声明

为私有成员的adjacency_list无法在实例/对象范围之外看到。这意味着在调用access_edge时,该函数甚至没有了解数据结构的许可。

您必须清楚地记住,OOP是关于数据所有权和访问权限的。这就是像privatepublic等关键词的全部内容。若要实现要执行的操作,可以使用以下方法之一:

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

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

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