2016-04-28 124 views
1

我可能已经知道答案,但我仍然想看看是否有人能想出一个更好的主意。C++打破循环包括

在较大的库中,我有很多类彼此交叉引用。我通常通过forward声明这些类来解决这个问题。然而,为了便于使用,我通常会定义一个参考类型,它可以出现在这样一个shared_ptr类:

class A : public B { 
public: 
    typedef std::shared_ptr<A> Ref; 
}; 

它允许好得多引用:A::Ref a代替std::shared_ptr<A> a。我现在看到的问题是使用这样的Ref需要实际包含该头文件,导致循环包含。我无法在包含前向声明的文件中定义Ref类型,因为XCode使用这样的共享指针显示vars的完全伪造值。

还有什么其他的选择可以做到这两点:让Ref在真实类型上定义,但不需要包含包含该类型的头文件?

回答

1

我不确定你实际上可以解决这个确切的问题。

但是,如果只是为了让你的代码更漂亮,你可以稍微改变一下逻辑。

有一个名称空间Refs,用于定义您的typedefs。例如:

namespace Refs { typedef std::shared_ptr<::A> A; } 

所以,相反的A::Ref,您使用Refs::A。我同意它的逻辑性稍差,但至少打字时间并不长。现在,您可以在各种头文件中根据需要定义这种类型定义,并最终向前声明它们(当然,前提是您还需要前面声明类)。

其他选项

但实际上,我会为这个做的,如果我是你,是使用别名(这需要C++ 11)std::shared_ptr

template<class T> using Ref = std::shared_ptr<T>; 

然后你不需要在任何类或名称空间中声明任何内容。只需使用Ref<A>,这更灵活,更清晰。

+0

这可能是要走的路。在上面的/封闭的名称空间中向A中添加一个前向声明,并将其放入一个标题中。 – Kent

+0

Ref <>模板别名的确是这里最好的解决方案,并且完全满足了两个条件。 –