2012-08-31 62 views
1

我想知道是否有人可以提供建議,而無需重新構建,以解決這種情況的方法:我有一個包含類聲明的頭並聲明瞭它使用的一些類引用/指針這顯然是很好的做法相比,只是包含這些類的頭文件。如何解決在C++頭文件中聲明typedef

struct Foo; 

struct Bar; 

struct MyStruct 
{ 
    void doIt(const Foo* foo); 

    void doIt(const Bar* bar); 
}; 

然而,儘管在上述的Foo的例子是一個類,酒吧實際上是按照下面的粗實例的類的一個typedef:

#include <fd_ex.h> 

struct Foo 
{ 
    int a; 
}; 

struct Bar_ 
{ 
    int a; 
}; 

typedef Bar_ Bar; 

這會導致一些問題,如predeclaring struct Bar明顯不正確 - Bar不是一個結構:

"fd_ex.cpp", line 13: Error: Multiple declaration for Bar. 
"fd_ex.cpp", line 19: Error: The name Bar is ambiguous, Bar and Bar. 
2 Error(s) detected. 

我不希望暴露Bar_如果可能的話,主要是因爲在現實生活中這可能比這個例子複雜得多。

但是,如果我有Bar沒有控制在結構聲明和類型定義,還有什麼技術,我可以在MyStruct頭使用跟上,宣佈前Bar精神?

+0

我猜你的編譯器只是混淆起來,你預定義的bar作爲一個類,然後(通過typedef)作爲一個結構Bar_。嘗試使用結構欄;在你的頭文件中。另外,在毫無意義地抨擊其他人使用結構的傾向之前,請記住http://msdn.microsoft.com/en-us/library/ms229017.aspx ;-) – Najzero

+0

你基本上說:「我想要聲明一個函數,但我不會告訴你這個參數有什麼類型。「你不能那樣做。 –

+0

@Najzero:它們實際上都是結構,但這個例子並不重要,因爲'Bar'既不是類也不是結構。我會改變這個例子來使其更清楚,但爲了避免疑問,它仍然沒有幫助。 –

回答

3

您可以轉發聲明結構本身:

struct Bar_; 

typedef Bar_ Bar; 

class MyClass 
{ 
    void DoIt(Bar*); 
}; 
+2

或甚至'typedef struct Bar_ Bar;'在一行中......但我認爲OP不希望任何人在標題中說'Bar_'! –

+1

-1作者說:「我不想暴露'Bar_'」。 –

+1

@PaulManta:**如果可能**,暴露'Bar_'結構定義和'Bar_'符號是有區別的。 –

2

這應該做的伎倆:

struct Bar_; 
typedef Bar_ Bar; 
+0

-1作者說:「我不想暴露'Bar_'」。 –

5

我不知道,如果它的工作原理完全用C++相同,但在C,我經常宣稱「不透明」結構,這在頭文件(假設mystruct.h)有:

typedef struct MyStruct_ MyStruct; 

// + function prototypes using MyStruct* 

的d然後我可以使用指針MyStruct實際上不知道它是什麼,如:MyStruct *x;,但不MyStruct x[3];(如編譯不知道MYSTRUCT的大小)

然後將源文件mystruct.c在我定義了struct MyStruct_

所以我認爲你可以嘗試更換:

class Bar; 

有:

typedef struct Bar_ Bar; 

(你很可能只是說在C typedef Bar_ Bar; ++)