这是我的标题:
#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;
};
Run Code Online (Sandbox Code Playgroud)
我的问题是:我是否必须将typedef放在MessageP*_msgArr正上方的类块中,还是可以将它放在所有#define附近?
它不输出编译错误,所以我不确定.
ken*_*ytm 14
在课堂之外,那种类型必须被称为Timing::Message,所以
typedef Timing::Message* MessageP;
Run Code Online (Sandbox Code Playgroud)
但这只有在声明之后才有可能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;
};
Run Code Online (Sandbox Code Playgroud)
您没有得到编译错误,可能是因为Message全局范围中的另一种类型已经存在.
把它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
Run Code Online (Sandbox Code Playgroud)