在类头中包含typedef

时间:2010-09-06 18:00:25

标签: c++

这是我的标题:

#ifndef TIMING_H
#define TIMING_H

#define MAX_MESSAGES 1000
typedef Message* MessageP; //inside the class?

class Timing {

public:

 Timing();

private:

 struct Message {
  Agent *_agent;
  double _val;
 };

 MessageP* _msgArr;
 int _waitingMsgs;


};

我的问题是:我是否必须将typedef放在MessageP * _msgArr正上方的类块中,还是可以将它放在所有#define附近?

它不输出编译错误,所以我不确定。

3 个答案:

答案 0 :(得分:14)

在课堂之外,该类型必须称为Timing::Message,所以

typedef Timing::Message* MessageP;

但只有在声明Timing::Message之后才能实现这一点,但在MessageP声明完成之前使用了Timing,所以这是不可能的。

此外,struct是private:成员,因此无论如何都无法在外部定义。 typedef必须在Timing类内完成。

class Timing {

public:

 Timing();

private:

 struct Message {
  Agent *_agent;
  double _val;
 };

 typedef Message* MessageP;   // <--


 MessageP* _msgArr;
 int _waitingMsgs;


};

您可能没有收到编译错误,因为全局范围内的另一个Message类型已经存在。

答案 1 :(得分:5)

typedef放在有意义的地方。

将其置于顶部意味着您在全局命名空间范围注入别名。将它放在类中可能意味着它只能被世界查看或仅对成员(和/或其子类)可见,具体取决于最近的访问说明符(如果没有,则为private)。

如果班级的客户不需要知道此别名,请将其标记为私有。

如果你把它放在课堂里:请注意,在课堂之外,你需要将名称完全限定为Timing::MessageP,否则在范围内需要using Timing::MessageP指令。此外,只有在定义了类后才能进行完全限定(不能为不完整类型创建别名 - 前向声明Timing因此不起作用。)

class Timing {
    public:
     Timing() {}
    private:

 struct Message {
  Agent *_agent;
  double _val;
 };

 MessageP* _msgArr;
 int _waitingMsgs;

};

typedef Timing::Message* MessageP; // okay

答案 2 :(得分:1)

可以在顶部输出。但是,将其置于全球范围内并不像其他提到的那样,这不是一个好习惯。