这是我的标题:
#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附近?
它不输出编译错误,所以我不确定。
答案 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)
可以在顶部输出。但是,将其置于全球范围内并不像其他提到的那样,这不是一个好习惯。