我想知道是否有人可以在不进行重组的情况下,就解决这种情况的方法提出建议:我有一个标头,它包含一个类声明,并声明了它通过引用/指针使用的许多类,与简单地包括这些类的标头相比,这显然是一个很好的做法。
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
的精神吗?
我不确定它在C++中是否完全一样,但在C中,我经常声明"不透明"结构,它在头文件(比如mystruct.h
)中有:
typedef struct MyStruct_ MyStruct;
// + function prototypes using MyStruct*
然后我可以使用指向MyStruct
的指针,而不知道它是什么,比如:MyStruct *x;
,但不知道MyStruct x[3];
(因为编译的不知道MyStruct的大小)
然后在源文件CCD_ 11中,我定义了CCD_。
所以我认为你可以尝试替换:
class Bar;
带有:
typedef struct Bar_ Bar;
(您可能只是在c++中说typedef Bar_ Bar;
)
您可以转发声明结构本身:
struct Bar_;
typedef Bar_ Bar;
class MyClass
{
void DoIt( Bar* );
};
这应该可以做到:
struct Bar_;
typedef Bar_ Bar;