1

我有一个循环依赖简化为以下内容:

// Bar.h
struct Bar {};

// Base.h
#include "Foo.h"
struct Bar;
struct Base {
    void func(std::shared_ptr<Foo<Bar>> foobar); // use methods of Foo in some way.
};

// Derived.h
#include "Base.h"
struct Derived : public Base {};

// Foo.h
#include "Derived.h"
template <typename T>
struct Foo {
    void func(std::shared_ptr<Derived> d) {
        // use methods of Derived in some way.
    }
};

我不能简单地向前声明FooBase.h因为它是一个模板类,Base由于Derived.h多态性而不能向前声明,也Derived不能Foo.h因为Foo::func使用Derived.

我之前读过关于将模板实现与声明分开的内容,我认为我不知道最佳实践并且不确定它是否适用于这种情况。这两个,Derived并且Foo在我的程序中被广泛使用。

我该如何解决这种依赖关系?

4

2 回答 2

2

声明一个接受 a 的函数std::shared_ptr<type>不需要完整的定义type,只需要一个(前向)声明。这使您可以避免#includeDerived.h(在 Foo.h 中)和/或 Foo.h(在 Base.h 中)

于 2013-09-18T14:41:04.293 回答
0

在相互引用的类中启用内联函数:

头啊

struct B;
struct A { 
    void a() {}
    void f();
    std::shared_ptr<B> b;
};
#include "A.tcc"

标头 A.tcc

#include B.h
inline void A::f() { b->b(); }

标头 Bh

struct A;
struct B { 
    void b() {}
    void f();
    std::shared_ptr<A> a;
};
#include "B.tcc"

标头 B.tcc

#include A.h
inline void B::f() { a->a(); }

请确保所有文件都有标题保护!

于 2013-09-18T14:50:59.070 回答