如何克服此前向声明错误?

时间:2015-03-06 01:08:06

标签: c++ forward-declaration

我试图做一个类A的准系统示例,它通过向自身传递引用为依赖类B提供回调方法。我生产的最好的是:

A.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'

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

1 个答案:

答案 0 :(得分:1)

在您的文件b.cc中,您必须包含a.h
在.h文件中,由于包含多个,但由于不包含.cc文件,因此它们可以包含他们想要的任何内容。

注意:

您不应在a.h文件中转发声明b,因为它已在b.h中声明并且您已将其包含在内。

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