C ++打破循环包括

时间:2016-04-28 19:51:44

标签: c++

我可能已经知道了答案,但我仍然想知道是否有人能想出更好的主意。

在较大的库中,我有许多类交叉引用彼此。我通常通过向前声明这些类来解决这个问题。但是,为了便于使用,我通常为可以出现在shared_ptr中的类定义一个ref类型,如下所示:

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 个答案:

答案 0 :(得分:1)

实际上,我不确定你能解决这个问题。

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

有一个命名空间Refs,您可以在其中定义typedef。例如:

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

因此,您使用A::Ref代替Refs::A。我同意它不太符合逻辑,但至少打字的时间不长。现在,你可以在你的各种标题中定义这样的typedef,并最终向前声明它们(前提是你也提前声明了这个类)。

其他选项

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

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

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