如何在C++标头中声明typedef



我想知道是否有人可以在不进行重组的情况下,就解决这种情况的方法提出建议:我有一个标头,它包含一个类声明,并声明了它通过引用/指针使用的许多类,与简单地包括这些类的标头相比,这显然是一个很好的做法。

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;

最新更新