English 中文(简体)
在使用typedef定义类型时,包含在头文件中的规则
原标题:
  • 时间:2009-03-10 19:06:50
  •  标签:

如果我创建

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

这里的链接规则是什么?

最佳回答

你只需要类的前向声明就可以了。

#ifndef _TEST_
#define _TEST_

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

#endif

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

问题回答

你需要至少在作用域中有一个 MyClass 的声明——至少是前置声明。Typedef 会创建一个别名。它不会创建一个新的类型或改变链接。链接将是 MemFuncGetter 的链接。

是的,前向声明就足够了。

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

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

请包含前向声明- 这就足够了。不要复制并粘贴 typedef。在您的 MyClass.h 中仅包含 MyClassFwd.h。





相关问题
热门标签