Перенаправление объявлений typedef, влияние на время сборки и соглашения об именах

StackOverflow https://stackoverflow.com/questions/1419463

Вопрос

Мне интересно, какое влияние мой подход 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&' напрямую.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top