如果我创建
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
这里的连锁规则是什么?
答案 0 :(得分:2)
你只需要上课的前瞻声明即可:
#ifndef _TEST_
#define _TEST_
class MyClass;
typedef double (MyClass::*MemFuncGetter)();
#endif
但请注意,通过不包括整个类,编译器必须做额外的工作来处理MyClass是多虚拟继承混乱的情况,因为它不知道。在某些情况下,这可能意味着每个函数指针实际上最多占用20个字节的内存。如果你已经定义了整体,那么每个函数指针只需要4个。(当然,这些大小都是编译器相关的)。
答案 1 :(得分:0)
创建文件MyClassFwd.h并放在那里
class MyClass;
typedef double (MyClass::*MemFuncGetter)();
并包括前进decl - 这就足够了。不要复制和粘贴typedef。在你的'MyClass.h'中只包含'MyClassFwd.h'
答案 2 :(得分:0)
你需要至少在范围内声明MyClass
- 至少是前瞻声明。 Typedef创建一个别名。它不会创建新类型或更改链接。链接将是MemFuncGetter
的链接。
答案 3 :(得分:0)
是的,向前退缩就足够了。