[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'有没有办法得到它?在一个更复杂的程序中,我尝试通过引用传递它,返回它,以及其他东西,但它们似乎都没有用。我完全不确定该怎么做。
答案 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是关于数据所有权和访问权限的。这就是private
,public
等关键字的全部内容。要实现您的目标,您可以使用以下方法之一:
通过在行前添加public:
来声明adjacency_list为公共成员。
如果您确实要隐藏数据结构,请创建允许访问数据的access_adjacency_list和modify_adjacency_list等公共访问函数。如果您需要传递列表,请传递列表的副本。
是的,你需要传递对象实例以进行访问,因为你声明列表是非静态的。