Мне любопытно, как мой подход typedef влияет на мои сборки.
Пожалуйста, рассмотрите следующий пример.
#include "SomeClass.h"
class Foo
{
typedef SomeClass SomeOtherName;
SomeOtherName* storedPointer;
void setStoredPointer(SomeOtherName* s);
}
void Foo::setStoredPointer(SomeOtherName* s)
{
storedPointer = s;
}
Всякий раз, когда я сталкиваюсь с ситуациями, подобными описанным выше, это вбирает typedef в файл заголовка и, следовательно, требует, чтобы я # включил его в файл заголовка. Я обеспокоен тем, что отсутствие предварительных объявлений может привести к увеличению времени сборки.
Основано на комментариях к этому сообщению:
Предварительное объявление определения типа в C ++
Я могу переслать объявление класса, ввести typedef ссылку или указатель, а затем #include в файле .cpp. Это должно позволить более быстрое время сборки. Я прав в своих выводах по этому поводу?
Если это так, я получу typedef, например:
typedef SomeClass* SomeOtherNamePtr;
typedef SomeClass& SomeOtherNameRef;
typedef const SomeClass* SomeOtherNameConstPtr;
typedef const SomeClass& SomeOtherNameConstRef;
Для меня это не очень чистый код, и я думаю, что прочитал статьи / сообщения (не обязательно на SO), рекомендующие против этого.
Считаете ли вы это приемлемым? Лучшие альтернативы?
Обновление:
Используя ответ Майкла Берра, я смог разобраться только с указателями и ссылками. Однако, я столкнулся с проблемой при попытке использовать sizeof () в моей функции. Например, скажем, у класса есть следующая функция:
//Foo.h
class Foo
{
typedef class SomeClass SomeOtherName;
void doSomething(const SomeOtherName& subject)
}
//Foo.cpp
#include "Foo.h"
#include "SomeClass.h"
void Foo::doSomething(const SomeOtherName& subject)
{
sizeof(subject); //generates error C2027: use of undefined type 'SomeClass';
sizeof(SomeClass); //generates same error, even though using the sizeof()
//the class that has been #include in the .cpp. Shouldn't
//the type be known by now?
}
Кроме того, это будет работать.
//Foo.h
class SomeClass;
class Foo
{
void doSomething(const SomeClass& subject)
}
//Foo.cpp
#include "Foo.h"
#include "SomeClass.h"
void Foo::doSomething(const SomeClass& subject)
{
sizeof(subject);
sizeof(SomeClass);
}
Я использую Microsoft Visual C ++ 6.0. Это ошибка компилятора или это вообще не соответствует стандарту?
В примере с ошибкой обратите внимание, что sizeof (SomeClass) - это исходный класс typedef, а не новый тип typedef, создаваемый в Foo. Я удивлен, что предварительное объявление в typedef ограничивает мою способность делать что-либо с классом typedef.
Followup:
Просто протестировал его с помощью компилятора XCode, и я считаю, что мой вопрос sizeof был проблемой компилятора Visual C ++ 6.0. Я предполагаю, что компилятор XCode, вероятно, правильный, но у меня нет больше ничего, чтобы попробовать в данный момент. Так что, хотя это было информативно, мне лично не повезло с моей текущей задачей, так как лучший ответ не работает для моей ситуации.