如何在C ++头文件中声明typedef

时间:2012-08-31 09:15:48

标签: c++ class header 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

3 个答案:

答案 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;