单个标头库中的循环依赖关系

时间:2016-04-08 10:10:05

标签: c++

考虑一个仅头文件库实现,如下所示,foo和bar具有循环依赖性。

class bar;
class foo {
public:
    foo(std::shared_ptr<bar> bar_){
        //bar_->mar()
    }
    void moo() {};
};


class bar {
    bar(std::shared_ptr<foo> foo_) {
        foo_->moo();
    }
    void mar() {  };
};

将此标题包含在(client.cpp)文件中并注释掉// bar _-&gt; mar(),编译器会给出错误:

error C2027: use of undefined type 'bar'
see declaration of 'bar'
error C2039: 'mar': is not a member of 'std::shared_ptr<bar>'
考虑到库只是标题的约束,

是可解决的问题吗?

1 个答案:

答案 0 :(得分:3)

出现问题的原因是您在类定义之前尝试调用类“bar”的方法“marr()”。当你调用“bar _-&gt; mar();”时,你只声明了类“bar”。编译器知道有一个类“bar”但不知道它有什么方法。 解决方案是在定义“bar”之后调用“foo”的构造函数。如果您的库只是标题,则可以将其声明为“内联”。

此代码编译好:

#pragma once
#include <memory>

class bar;
class foo {
public:
    foo(std::shared_ptr<bar> bar_);
    void moo() {};
};


class bar {
public:
    bar(std::shared_ptr<foo> foo_) {
        foo_->moo();
    }
    void mar() {  };
};

inline foo::foo(std::shared_ptr<bar> bar_){
    bar_->mar();
}