правила для включения в заголовочные файлы при использовании type в typedef - PullRequest
1 голос
/ 10 марта 2009

если я создам

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 ]

2 голосов
/ 10 марта 2009

У вас все в порядке только с предварительным объявлением класса:

#ifndef _TEST_
#define _TEST_

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

#endif

Но обратите внимание, что, не включая весь класс, компилятору приходится выполнять дополнительную работу для обработки случаев, когда MyClass представляет собой беспорядок с множественным виртуальным наследованием, поскольку он не знает. В некоторых случаях это может означать, что каждый указатель функции на самом деле занимает до 20 байт памяти. Принимая во внимание, что если бы вы определили целое, каждый указатель на функцию занял бы только 4. (Конечно, все размеры зависят от компилятора).

0 голосов
/ 10 марта 2009

Да, вперед будет достаточно.

0 голосов
/ 10 марта 2009

У вас должна быть хотя бы декларация MyClass в области видимости - как минимум, предварительная декларация. Typedef создает псевдоним. Он не создает новый тип и не изменяет связь. Связь будет MemFuncGetter.

0 голосов
/ 10 марта 2009

Создайте файл MyClassFwd.h и поместите туда

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

И включите forward decl - этого будет достаточно. Не копируйте и не вставляйте typedef. В ваш «MyClass.h» просто включите «MyClassFwd.h»

...