2012-08-31 35 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; ++)