1

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

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_,主要是因为在现实生活中这可能比这个例子复杂得多。

但是,如果我无法控制struct 声明和 typedef for Bar,是否可以在标头中使用任何技术MyStruct来保持预先声明的精神Bar

4

3 回答 3

5

我不确定它在 C++ 中是否完全相同,但在 C 中,我经常声明“不透明”结构,它在头文件(比如说mystruct.h)中具有:

typedef struct MyStruct_ MyStruct;

// + function prototypes using MyStruct*

然后我可以在MyStruct不知道它是什么的情况下使用指针,例如:MyStruct *x;,但不是MyStruct x[3];(因为编译后不知道 MyStruct 的大小)

然后在源文件中mystruct.c定义struct MyStruct_.

所以我认为你可以尝试替换:

class Bar;

和:

typedef struct Bar_ Bar;

(你可能只typedef Bar_ Bar;用 C++ 说)

于 2012-08-31T09:35:04.050 回答
4

您可以转发声明结构本身:

struct Bar_;

typedef Bar_ Bar; 

class MyClass
{
  void DoIt( Bar* );
};
于 2012-08-31T09:26:00.300 回答
2

这应该可以解决问题:

struct Bar_;
typedef Bar_ Bar;
于 2012-08-31T09:30:33.953 回答