[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是关于数据所有权和访问权限的。这就是像private
、public
等关键词的全部内容。若要实现要执行的操作,可以使用以下方法之一:
通过在行前添加
public:
将adjacency_list声明为公共成员。如果确实要隐藏数据结构,请创建允许访问数据的公共访问函数,如access_adjacency_list和modify_adjacency_list。如果需要传递列表,请传递列表的副本。
是的,您需要传递对象实例以进行访问,因为您将列表声明为非静态列表。