Прямые объявления typedef, влияние на время сборки и соглашения об именах - PullRequest
1 голос
/ 14 сентября 2009

Мне любопытно, как мой подход 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, вероятно, правильный, но у меня нет больше ничего, чтобы попробовать в данный момент. Так что, хотя это было информативно, мне лично не повезло с моей текущей задачей, так как лучший ответ не работает для моей ситуации.

Ответы [ 2 ]

2 голосов
/ 14 сентября 2009

Будет

typedef class SomeClass SomeOtherName;

Трюк для тебя?

При этом блок компиляции, использующий typedef только для указателей или ссылок, не должен #include заголовок SomeClass.

0 голосов
/ 14 сентября 2009

Я прав в своих выводах по этому поводу?

Да. Один из ответов на вопрос, на который вы ссылались, предполагает, что вы можете:

//forward declaration instead of #include "SomeClass.h"
class SomeClass;
//now this works even without #include "SomeClass.h"
typedef SomeClass SomeOtherName;

Для меня это не очень чистый код

Я не вижу, чтобы ваши typedefs добавляли какое-либо значение; вместо этого я, вероятно, объявил бы SomeClass и затем использовал бы '1013 * напрямую.

...