c ++:访问抽象基类中的私有变量

时间:2013-12-04 07:52:36

标签: c++ abstract-class private-members traveling-salesman

长期潜伏者,第一次问问。我正在用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。对不起,浪费你的时间,如果你愿意,我会很快删除这个。谢谢你们,再次抱歉。

3 个答案:

答案 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的读/写权限。试试吧,它会起作用。