这一堆typedef应该是私有的还是公共的?

时间:2014-05-23 08:17:42

标签: c++ class graph typedef

我正在写一个代表图形的类,所以我写了以下标题

class Graph {
public:
  Graph(); 
  Graph(int N);

  void addVertex();
  void addEdge(VertexNum v1, VertexNum v2, Weight w);


  std::pair<PathLength, Path> shortestPath
    (const VerticesGroup& V1, const VerticesGroup& V2);


private:
  typedef int                           VertexNum;
  typedef int                           Weight;
  typedef std::pair<VertexNum, Weight>  Edge;
  typedef std::vector<Edge>             Path;
  typedef size_t                        PathLength;
  typedef std::vector<VertexNum>        VerticesGroup;


  std::vector<std::list<Edge> > adjList;

  bool incorrectVertexNumber(VertexNum v);
};

我对上述代码有一些疑问:

  1. 我应该声明一堆typedef是public还是private?
  2. 这是一种常规做法,当一个type将一个类型解析为不同的同义词时(比如typedef int VertexNum; typedef int Weight;)?

3 个答案:

答案 0 :(得分:8)

该类的typedef接口中使用的任何public都应位于该类的public部分。休息应该是private

答案 1 :(得分:5)

1。 C ++中的访问控制纯粹应用于名称。 ISO / IEC 14882:2011 11 [class.access] / 4中有一个注释和示例,表明这是意图。

[...] [ Note: Because access control applies to names, if access control is applied to a typedef name, only the accessibility of the typedef name itself is considered. The accessibility of the entity referred to by the typedef is not considered. For example,

class A {
  class B { };
public:
  typedef B BB;
};

void f() {
   A::BB x; // OK, typedef name A::BB is public
  A::B y; // access error, A::B is private
}
—end note ]

2。 没关系,因为你可以使某些类型有意义且容易理解。

答案 2 :(得分:2)

  1. 如果您声明为private,则无法在课堂外使用它们。我想这不是你想要的,特别是如果你的公共接口中typedef ed名称显示为参数类型。如果您在课程中限制使用typedef ed名称,请将其设为private
  2. 当然,通常的做法是使用typedef将类型重命名为域级别更易于理解/易于理解的名称。