C++ 在typedef中使用type时包含在头文件中的规则

C++ 在typedef中使用type时包含在头文件中的规则,c++,header-files,C++,Header Files,如果我创造 typedef double (MyClass::*MemFuncGetter)(); 在头文件中,我需要包含“MyClass.h”还是转发声明就足够了 头文件: #ifndef _TEST_ #define _TEST_ #include "MyClass.h" //do I need this? //or I can just say class MyClass; typedef double (MyClass::*MemFuncGetter)(); #endif

如果我创造

typedef double (MyClass::*MemFuncGetter)();
在头文件中,我需要包含“MyClass.h”还是转发声明就足够了

头文件:

#ifndef _TEST_
#define _TEST_


#include "MyClass.h" //do I need this?
//or I can just say class MyClass;

typedef double (MyClass::*MemFuncGetter)();


#endif

这里的链接规则是什么?

创建文件MyClassFwd.h并放在那里

class MyClass;
typedef double (MyClass::*MemFuncGetter)();

包括前锋decl——这就足够了。不要复制和粘贴typedef。在“MyClass.h”中,只需包含“MyClassFwd.h”

您需要在作用域中至少有一个
MyClass
声明——至少有一个转发声明。Typedef创建一个别名。它不会创建新类型或更改链接。链接将是
MemFuncGetter

的链接,您只需要类的前向声明即可:

#ifndef _TEST_
#define _TEST_

class MyClass;
typedef double (MyClass::*MemFuncGetter)();

#endif

但是请注意,由于不包括整个类,编译器必须做额外的工作来处理MyClass是多重虚拟继承混乱的情况,因为它不知道。在某些情况下,这可能意味着每个函数指针实际上占用多达20字节的内存。然而,如果定义了整个函数,则每个函数指针只取4。(当然大小都取决于编译器)

是的,转发声明就足够了。

这是我的问题,转发声明是否足够?