2013-04-29 123 views
4

我有一个很大的头文件(〜10000行),这是由我的控制脚本/程序自动生成的。正向声明一个typedef

为了避免包括在我的课的申报文件,我向前声明几种类型,我需要:

--myclass.h

namespace bl { 
    class TypeA; 
    class TypeB; 
} 
// Other stuff and myclass definition... 

现在事实证明,TypeATypeB不是类的名字,但自动生成的文件中,而不是被定义为:

typedef SomeUnspecifiedClassName TypeA; 
typedef AnotherUnspecifiedClassName TypeB; 

SomeUnspecifiedClassName我的意思我不能转发 - 声明此类型名称,因为它可能会在各种情况下更改。

我该如何转发 - 声明typedef? (不能使用c + + 11)

+0

你可以通过引用和指针使用该类吗? http://stackoverflow.com/questions/553682/when-to-use-forward-declaration – 2013-04-29 20:45:58

+0

在您的最后一句话中,您的具体问题的答案已经在第一个相关问题中得到了解答:http://stackoverflow.com/questions/804894/forward-declaration-of-a-typedef-in -c?rq = 1 – jxh 2013-04-29 20:46:08

+0

根据TypeA和TypeB的使用位置,可以考虑将'myclass'重构为模板。 – jxh 2013-04-29 20:53:38

回答

6

只是 - 你不能。但是,如果您发布特定情况,可能会出现一些解决方法。

+0

我通过直接键入“未指定”类型来处理一些宏(实际上很多)。 – sbabbi 2013-04-29 23:03:57

4

您可以编写一个脚本,从自动生成的源文件中的typedef行中提取...UnspecifedClassName。然后,这个脚本将成为你自己生成的头文件的基础,这个头文件将会向这些类声明这些类以及你的typedef语句。那么你的myclass.h文件可以用#include那个头文件。我发现有时有用

1

一个相对体面的解决方案是创建一个简单的包装类:

放置在一个头文件:

class ClassA; 
// now use pointers and references to ClassA at will 

放置在一个源文件:

#include <NastyThirdPartyHeader> 

class ClassA: public TypeA { 
public: 
    ClassA(TypeA const &x): TypeA(x) {} 
    ClassA &operator=(TypeA const &x) { 
    TypeA::operator=(x); 
    return *this; 
    } 
}; 

根据您的使用情况,这可能是您所需要的。