C++ 转发typedef声明、对构建时间的影响和命名约定

C++ 转发typedef声明、对构建时间的影响和命名约定,c++,typedef,forward-declaration,build-time,C++,Typedef,Forward Declaration,Build Time,我很好奇typedef方法对构建的影响 请考虑下面的例子。 #include "SomeClass.h" class Foo { typedef SomeClass SomeOtherName; SomeOtherName* storedPointer; void setStoredPointer(SomeOtherName* s); } void Foo::setStoredPointer(SomeOtherName* s) { storedPointe

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

请考虑下面的例子。

#include "SomeClass.h"

class Foo
{
    typedef SomeClass SomeOtherName;

    SomeOtherName* storedPointer;

    void setStoredPointer(SomeOtherName* s);
}

void Foo::setStoredPointer(SomeOtherName* s)
{
    storedPointer = s;
}
每当出现上述情况时,这会将typedef驱动到头文件中,因此需要将其包含在头文件中。我担心缺乏前瞻性声明可能会导致更长的构建时间

根据这篇文章的评论:

我可以向前声明类,键入引用或指针,然后#包含在.cpp文件中。这将允许更快的构建时间。我的结论正确吗

如果是这样的话,我会得到这样一个typedef:

typedef SomeClass* SomeOtherNamePtr;
typedef SomeClass& SomeOtherNameRef;
typedef const SomeClass* SomeOtherNameConstPtr;
typedef const SomeClass& SomeOtherNameConstRef;
在我看来,这不像是一个非常干净的代码,我想我已经读过反对这一点的文章/帖子(不一定如此)

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


更新: 使用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);
}
我使用微软Visual C++ 6。这是编译器的一个bug还是总体上违反了标准

在出现错误的示例中,请注意sizeof(SomeClass)是typedef中的原始类,而不是在Foo中创建的新typedef类型。我感到惊讶的是,在typedef中执行转发声明限制了我对正在被typedef的类执行任何操作的能力


后续行动: 只是使用XCODEL编译器测试它,我相信我的问题是Visual C++ 6编译器问题。我猜XCode编译器可能是正确的,但我目前没有其他东西可以尝试。因此,虽然这是一个信息量大的问题,但我个人在目前的任务中运气不佳,因为最好的答案不适合我的情况。

typedef class SomeClass SomeOtherName;
帮你玩这个把戏

这样,仅对指针或引用使用
typedef
的编译单元就不需要包含
SomeClass

我的结论正确吗

对。您提到的问题中的一个答案表明您可以:

//forward declaration instead of #include "SomeClass.h"
class SomeClass;
//now this works even without #include "SomeClass.h"
typedef SomeClass SomeOtherName;
在我看来,这不像是非常干净的代码


我看不出你的typedef有任何价值;相反,我可能会向前声明
SomeClass
,然后直接使用“
const SomeClass&
”。

我尝试了你的建议,实际上它解决了类完全处理指针和引用的特定情况。但是,我发现在.cpp文件中,在我的例子中,尝试对类执行某些操作(使用sizeof())的文件仍然存在问题。我将用一个例子来更新这个问题。这是设计好的。在不知道对象的实际定义的情况下,编译器无法计算出对象的大小。在处理incomlete类型时,您可以声明指向该类型的引用或指针,但您不能做很多其他事情,因为编译器只知道名称,而不知道该类型的其他信息。使用指向不完整类型的引用/指针可以避免类的头文件依赖于另一个头文件,但实现仍需要包含目标类型的完整声明。使用不完整的类型可能会妨碍你实现内联的方法。我只是在不同的编译器上测试了我最后一个问题,看起来我的后续问题真的是Visual C++ 6的问题。我在我的mac上进行了测试,当我在实现文件中包含头文件时,它能够解析类型及其大小。