我可能已经知道了答案,但我仍然想知道是否有人能想出更好的主意。
在较大的库中,我有许多类交叉引用彼此。我通常通过向前声明这些类来解决这个问题。但是,为了便于使用,我通常为可以出现在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,但不要求包含包含该类型的标题?
答案 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>
,即更灵活,更清晰。