1

我找到了 C++ 中 typedef 前向声明的答案(https://stackoverflow.com/a/2095798)。但我的情况是这样的:

// a.h
 typedef struct{
    unsigned char bah0 : 1;
    unsigned char bah1 : 1;
    unsigned char bah2 : 1;
    unsigned char bah3 : 1;
    unsigned char bah4 : 1;
    unsigned char bah5 : 1;
    unsigned char bah6 : 1;
    unsigned char bah7 : 1;
 } bah;

// b.h
typedef struct bah;  // Error: using typedef-name 'bah' after struct

 class foo {
   foo(bah b);
   bah mBah;
 };

// b.cpp
 #include "b.h"
 #include "a.h"

 foo::foo(bah b) 
 {
   mBah = b;
 }

并且我不允许更改任何内容,a.h并且我想避免包含a.hb.h. 在这种情况下,如何避免此错误或转发 declarte bah 的正确方法是什么?

比你!兹拉坦

4

2 回答 2

2

我想避免在 bh 中包含 ah

太糟糕了。bh 取决于bahfrom ah 的定义 你想要的与语言的规则不一致。

我怎样才能避免这个错误

选项 1:在 bh 中包含 ah 我知道您不想要这个,但我想包含所有可用的选项。

选项 2:不要依赖 ah 在 bh 中的定义一个例子:

// b.h
class foo {
    foo();
};

可以仅使用前向声明来定义以下类bah

class foo {
    foo(bah* b);
    bah* mBah;
};

但是,除非您可以转发声明结构,否则即使这也是不可能的。所以这让我们...

在这种情况下转发 declarte bah 的正确方法是什么?

无法转发声明未命名的结构。除非你能修改啊,否则你不能给结构体一个标签名。假设你可以改变啊,你会这样做:

typedef struct bah { // struct now has the tag name bah
    // ...
} bah;

由于结构的名称使 typedef 大多是多余的,您可以简化为:

 struct bah {
    // ...
 };

添加后,您可以转发声明:

struct bah;

但是前向声明不允许您声明 type 的变量bah


PS。位域对前向声明的工作方式没有影响。

于 2017-01-31T09:05:57.793 回答
1

您的解决方案中有太多依赖项。在代码的公共部分定义一次 blah。您将避免重新定义。

我建议像你一样在 ah 中定义 blah,然后:

1) 在 bh 中包含 ah 在 b.cpp 中包含 bh

2) 或在 b.cpp 中的 bh 之前包含 ah

于 2017-01-31T09:04:53.127 回答