1

我很好奇我的 typedef 方法对我的构建的影响。

请考虑以下示例。

#include "SomeClass.h"

class Foo
{
    typedef SomeClass SomeOtherName;

    SomeOtherName* storedPointer;

    void setStoredPointer(SomeOtherName* s);
}

void Foo::setStoredPointer(SomeOtherName* s)
{
    storedPointer = s;
}

每当我遇到上述情况时,都会将 typedef 驱动到头文件中,因此需要我将其 #include 到头文件中。我担心缺少前向声明可能会导致更长的构建时间。

根据这篇文章的评论:

C++ 中 typedef 的前向声明

我可以转发声明类,typedef 引用或指针,然后在 .cpp 文件中 #include。这应该允许更快的构建时间。我对此的结论是否正确?

如果是这样,我最终会得到这样的 typedef:

typedef SomeClass* SomeOtherNamePtr;
typedef SomeClass& SomeOtherNameRef;
typedef const SomeClass* SomeOtherNameConstPtr;
typedef const SomeClass& SomeOtherNameConstRef;

这对我来说看起来不是很干净的代码,我想我已经阅读了反对这个的文章/帖子(不一定是 SO)。

你觉得这可以接受吗?更好的选择?


更新:使用 Michael Burr 的回答,我只能解决指针和引用的情况。但是,在我的函数中尝试使用 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 中进行前向声明限制了我对作为 typedef 的类执行任何操作的能力。


跟进:刚刚使用 XCode 编译器对其进行了测试,我相信我的 sizeof 问题是 Visual C++ 6.0 编译器问题。我猜 XCode 编译器可能是正确的,但我目前没有其他尝试。因此,虽然这提供了信息,但我个人对我目前的任务不走运,因为最佳答案不适用于我的情况。

4

2 回答 2

2

typedef class SomeClass SomeOtherName;

为你做把戏?

这样,使用typedefonly 指针或引用的编译单元就不需要#includeSomeClass头了。

于 2009-09-14T02:58:29.913 回答
0

我对此的结论是否正确?

是的。您引用的问题中的一个答案表明您可以:

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

对我来说,这看起来不是很干净的代码

我没有看到您的 typedef 增加了任何价值。相反,我可能会前向声明SomeClass,然后const SomeClass&直接使用 ' '。

于 2009-09-14T02:59:34.713 回答