2013-04-29 78 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; 
    } 
}; 

根據您的使用情況,這可能是您所需要的。