gpt4 book ai didi

c++ - 我如何克服这个前向声明错误?

转载 作者:行者123 更新时间:2023-11-30 05:46:28 25 4
gpt4 key购买 nike

我正在尝试做一个类 A 的准系统示例,它通过传递对自身的引用来为依赖类 B 提供回调方法。我制作的最好的是:

啊.h

#ifndef A_H
#define A_H

#include "b.h"

namespace b {
class ClassB;
}

namespace a {

class ClassA {
public:
ClassA();
b::ClassB* m_b;
void callback(const std::string& msg);
};
}

#endif

a.cc

#include "a.h"

a::ClassA::ClassA() {
m_b = new b::ClassB(this);
}

void a::ClassA::callback(const std::string& msg) {
std::cout << msg << '\n';
}

int main(void)
{
a::ClassA* doit = new a::ClassA();
delete doit;
return 0;
}

b.h

#ifndef B_H
#define B_H

#include <iostream>
#include <string>

namespace a {
class ClassA;
}

namespace b {
class ClassB{
public:
ClassB(a::ClassA* a_inst);
};
}

#endif

b.cc

#include "b.h"

namespace b {

ClassB::ClassB(a::ClassA* a_inst) {
a_inst->callback("Call me maybe");
}
}

这是我能得到的最接近编译的结果,但我仍然遇到以下错误:

b.cc: In constructor 'b::ClassB::ClassB(a::ClassA*)':
b.cc:6:9: error: invalid use of incomplete type 'struct a::ClassA'
b.h:8:8: error: forward declaration of 'struct a::ClassA'

我该如何解决这个问题?是否有更好的方式来构建这种关系?

最佳答案

在您的文件 b.cc 中,您必须包含 a.h
在 .h 文件中你不能因为多重包含但是因为 .cc 文件没有被包含,它们可以包含他们想要的任何东西。

注意:

你不应该在你的 a.h 文件中转发声明 b 因为它是在 b.h 中声明的并且你包含了它。

如@chris 所述,您也可以删除 a.h 中的 #include "b.h" 并将其放入您的 a.cc.

关于c++ - 我如何克服这个前向声明错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28890748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com