1

如果我创建

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

这里的链接规则是什么?

4

4 回答 4

2

只需类的前向声明就可以了:

#ifndef _TEST_
#define _TEST_

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

#endif

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

于 2009-03-10T19:20:26.730 回答
0

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

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

并包括 forward decl - 这已经足够了。不要复制和粘贴 typedef。在您的“MyClass.h”中只需包含“MyClassFwd.h”

于 2009-03-10T19:13:02.037 回答
0

您至少需要有一个MyClass范围内的声明——至少是一个前向声明。typedef 创建一个别名。它不会创建新类型或更改链接。链接将是 的链接MemFuncGetter

于 2009-03-10T19:13:35.843 回答
0

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

于 2009-03-10T19:37:52.167 回答