C++ 打破循环包含

标签 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,但不需要包含包含该类型的 header ?

最佳答案

实际上,我不确定您能否解决这个确切的问题。

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

有一个 namespace Refs,您可以在其中定义 typedef。例如:

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

所以,而不是 A::Ref , 你使用 Refs::A .我同意这有点不合逻辑,但至少打字的时间不会太长。现在,您可以在各种 header 中需要的地方定义此类 typedef,并最终转发声明它们(当然前提是您之前也转发声明该类)。

其他选项

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

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

那么你不需要在任何类或命名空间中声明任何东西。只需使用 Ref<A> ,更加灵活清晰。

关于C++ 打破循环包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36924241/

相关文章:

c++ - 在多个 SDL_Renderer* 上使用 SDL_Texture*

c++ - 尝试链接从 CUDA 对象构建的共享库时出现 undefined symbol

android - 调试 Android native C++ : activate breakpoint

C++ 随机数生成 : Generate cos squared function

c++ - 使用 fread 读入 int 缓冲区

c++ - QToolButton 信号和槽

c++ - 无法在 C++ 中定义++ 运算符,这里有什么问题?

c++ - 对抽象类的引用不能传递给线程函数?

c++ - 为 C++ 二叉搜索树使用智能指针

c++ - 如果函数是在类范围内声明的,则 constexpr 不起作用