在类头中包含typedef

Ash*_*ban 14 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;


};
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全局范围中的另一种类型已经存在.

  • 可以使用前向声明,这样它就不必在课堂内. (2认同)

dir*_*tly 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
Run Code Online (Sandbox Code Playgroud)