长期潜伏者,第一次问问。我正在用c ++做一个关于TSP(旅行商问题)的项目,我有一个小问题。我需要占用两个节点(在这种情况下称为NodeID,它们是无符号整数)并在addEdge方法中添加它们之间的边缘。签名以及我老师的一些笔记(我将在后面填写前提条件):
/*
* Add a weighted, undirected edge between nodes u and v.
*
* Preconditions:
* u and v are legal labels (i.e. 0 <= u < G.size(), 0 <= v < G.size())
* u != v
* There is no edge between u and v.
* weight > 0
*/
void ListGraph::addEdge(NodeID u, NodeID v, EdgeWeight weight) {
/* Code here */
}
现在,我认为自己编码的方式是引用基类中的边和节点列表。但是,基类是抽象的,列表是私有的。这是该基类的全部内容。 注意:这个课程必须按原样保留(这是教师的课程,也是项目中为数不多的课程之一,我必须保持忠诚,并在不改变的情况下使用。) 这是:
#include <vector>
#include "Graph.h"
#pragma once
typedef std::list<NWPair> EList;
class ListGraph : public Graph {
public:
ListGraph(int numNodes);
~ListGraph();
// Modifiers
virtual void addEdge(NodeID u, NodeID v, EdgeWeight weight);
// Inspectors
virtual EdgeWeight weight(NodeID u, NodeID v) const;
virtual std::list<NWPair> getAdj(NodeID u) const;
virtual unsigned degree(NodeID u) const;
virtual unsigned size() const;
virtual unsigned numEdges() const;
private:
ListGraph() {;}
std::vector<EList> edgeList;
int num_edges;
};
我能想到在节点之间向边添加权重的唯一方法是访问此edgeList并进行更改。任何建议都会非常有用。
如果有人需要,这是Graph.h的全部内容:
#include <utility>
#include <list>
#pragma once
/*
* Useful typedefs, primarily for the purpose of read-ability.
*/
typedef unsigned NodeID;
typedef double EdgeWeight;
typedef std::pair<NodeID, EdgeWeight> NWPair;
class Graph {
public:
virtual ~Graph() {}
/*
* Add a weighted, undirected edge between nodes u and v.
*
* Preconditions:
* u and v are legal labels (i.e. 0 <= u < G.size(), 0 <= v < G.size())
* u != v
* There is no edge between u and v.
* weight > 0
*/
virtual void addEdge(NodeID u, NodeID v, EdgeWeight weight) = 0;
/*
* Get the weight between nodes u and v; return 0 if there is no edge.
*
* Preconditions:
* u and v are legal labels (i.e. 0 <= u < G.size(), 0 <= v < G.size())
*/
virtual EdgeWeight weight(NodeID u, NodeID v) const = 0;
/*
* Return a list of NodeID/EdgeWeight pairs describing the nodes adjacent to edge w.
*
* Preconditions: u is a legal label.
*/
virtual std::list<NWPair> getAdj(NodeID u) const = 0;
/*
* Return the degree (i.e. the number of neighorbs) of node u.
*
* Preconditions: u is a legal label;
*/
virtual unsigned degree(NodeID u) const = 0;
/*
* Return the number of nodes in the graph.
*/
virtual unsigned size() const = 0;
/*
* Return the number of edges in the graph.
*/
virtual unsigned numEdges() const = 0;
};
正如我所说,非常感谢任何帮助。谢谢!
编辑:尝试在“ListGraph :: addEdge”方法中使用“ListGraph :: edgeList”引用edgeList会导致错误。当我把光标放在上面时,它说: 错误:类“ListGraph”没有成员“edgeList”
编辑2:此代码包含三个文件。 Graph.h:不可改变,抽象;所有方法都在哪里 ListGraph.h:不可改变,多为抽象;其中edgeList和num_edges是(这些是私有的) ListGraph.cpp:我将把我的代码放在哪里,看似我无法访问私有变量,例如edgeList和num_edges
编辑3:我是一个IDIOT,我将ListGraph.cpp中的所有方法放在一个名为ListGraph的类中,因此程序正在搜索ListGraph.cpp而不是ListGraph.h。对不起,浪费你的时间,如果你愿意,我会很快删除这个。谢谢你们,再次抱歉。
答案 0 :(得分:1)
我认为你只是误解了这里的结构,或者我可能会这样做。
据我了解,您将把代码放入
addEdge()
中的方法
class ListGraph
这使您可以访问私有变量“edgeList”。
抽象类是“Graph”类,“ListGraph”继承。但是,ListGraph中的私有变量可用于ListGraph类。
你的逻辑很好,但是我认为你误解了“注意:这个类必须按原样保留”,如上所述
/* Code here */
在addEdge方法中,我确定你可以编辑它! :)
答案 1 :(得分:0)
在这种情况下,Graph
是基类,而不是ListGraph
,因此我不确定您的描述是否准确,但据我了解,您正在实施{{1} } ..所以你可以访问ListGraph::addEdge()
。
答案 2 :(得分:0)
基类Graph
实际上只是指定了从它派生时必须提供的内容 - 这就是它的功能是“纯虚拟”的原因。类ListGraph
是数据所在的位置,也是您定义函数addEdge
的位置。在该功能中,您将拥有edgeList
的读/写权限。试试吧,它会起作用。