Перенаправление объявлений typedef, влияние на время сборки и соглашения об именах
-
07-07-2019 - |
Вопрос
Мне интересно, какое влияние мой подход typedef оказывает на мои сборки.
Пожалуйста, рассмотрите следующий пример.
#include "SomeClass.h"
class Foo
{
typedef SomeClass SomeOtherName;
SomeOtherName* storedPointer;
void setStoredPointer(SomeOtherName* s);
}
void Foo::setStoredPointer(SomeOtherName* s)
{
storedPointer = s;
}
Всякий раз, когда я сталкиваюсь с ситуацией, подобной вышеописанной, это приводит к тому, что typedef помещается в файл заголовка и, таким образом, требуется #include его в файл заголовка.Я обеспокоен тем, что отсутствие предварительных объявлений может привести к увеличению времени сборки.
Судя по комментариям к этому посту:
Форвардное объявление typedef в C++
Я могу объявить класс, указать ссылку или указатель, а затем #include внутри файла .cpp.Это должно позволить сократить время сборки.Прав ли я в своих выводах по этому поводу?
Если да, то в итоге я получу следующее определение типа:
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, создаваемый в Foo.Я удивлен, что выполнение предварительного объявления в typedef ограничивает мои возможности делать что-либо с классом, который является typedef.
Следовать за:Только что протестировал его с помощью компилятора XCode, и я считаю, что мой вопрос о размере был связан с проблемой компилятора Visual C++ 6.0.Я предполагаю, что компилятор XCode, вероятно, прав, но в данный момент мне больше нечего пробовать.Итак, хотя это было информативно, лично мне не повезло с моей текущей задачей, поскольку лучший ответ не подходит для моей ситуации.
Решение
Бы
typedef class SomeClass SomeOtherName;
сделать трюк для тебя?
При этом модуль компиляции, использующий typedef
только для указателей или ссылок не нужно #include
тот SomeClass
заголовок.
Другие советы
Прав ли я в своих выводах по этому поводу?
Да.Один из ответов на вопрос, на который вы ссылаетесь, предполагает, что вы можете:
//forward declaration instead of #include "SomeClass.h"
class SomeClass;
//now this works even without #include "SomeClass.h"
typedef SomeClass SomeOtherName;
Мне это не кажется очень чистым кодом
Я не вижу, чтобы ваши определения типов приносили какую-либо пользу;вместо этого я бы, вероятно, заранее заявил SomeClass
а затем используйте 'const SomeClass&
' напрямую.