我想知道是否有人可以在没有重组的情况下提供建议来解决这种情况:我有一个包含类声明的标题,并声明了它通过引用/指针使用的一些类,这显然是比较好的做法简单地包括这些类的标题。
struct Foo;
struct Bar;
struct MyStruct
{
void doIt( const Foo* foo );
void doIt( const Bar* bar );
};
然而,虽然在上面的示例中,Foo是一个类,但Bar实际上是一个类的typedef,如下面的粗略示例所示:
#include <fd_ex.h>
struct Foo
{
int a;
};
struct Bar_
{
int a;
};
typedef Bar_ Bar;
这会导致一些问题,因为预先标记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
的结构声明和typedef有无控制,我是否可以在MyStruct
的标题中使用任何技术来保持预先宣布的精神Bar
?
答案 0 :(得分:5)
我不确定它在C ++中是否完全相同,但在C中,我经常声明&#34;不透明&#34; struct,在头文件中(让我们说mystruct.h
)有:
typedef struct MyStruct_ MyStruct;
// + function prototypes using MyStruct*
然后我可以使用指针MyStruct
而不知道它是什么,例如:MyStruct *x;
,但不是MyStruct x[3];
(因为编译时不知道MyStruct的大小)< / p>
然后在源文件mystruct.c
中定义struct MyStruct_
。
所以我认为你可以尝试替换:
class Bar;
使用:
typedef struct Bar_ Bar;
(你可以在c ++中说typedef Bar_ Bar;
)
答案 1 :(得分:3)
你可以转发声明结构本身:
struct Bar_;
typedef Bar_ Bar;
class MyClass
{
void DoIt( Bar* );
};
答案 2 :(得分:2)
这应该可以解决问题:
struct Bar_;
typedef Bar_ Bar;