我可能已经知道答案了,但我还是想看看是否有人能想出更好的主意。
在较大的库中,我有许多相互交叉引用的类。我通常通过转发声明这些类来解决这个问题。但是,为了便于使用,我通常为可以出现在 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/