Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;断裂循环包括_C++ - Fatal编程技术网

C++ C++;断裂循环包括

C++ C++;断裂循环包括,c++,C++,我可能已经知道答案了,但我还是想看看是否有人能想出更好的主意 在更大的库中,我有许多类相互交叉引用。我通常通过向前声明这些类来解决这个问题。但是,为了便于使用,我通常为可以出现在共享\u ptr中的类定义一个ref类型,如下所示: class A : public B { public: typedef std::shared_ptr<A> Ref; }; A类:公共B类{ 公众: typedef std::共享\u ptr Ref; }; 它允许更好的引用:A::refa而

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

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

class A : public B {
public:
  typedef std::shared_ptr<A> Ref;
};
A类:公共B类{
公众:
typedef std::共享\u ptr Ref;
};
它允许更好的引用:
A::refa
而不是
std::shared\u ptr A
。我现在看到的问题是,使用这样的Ref需要实际包含该头文件,从而导致循环包含。我无法在包含转发声明的文件中定义Ref类型,因为XCode使用这样的共享指针为vars显示完全虚假的值


还有什么其他选项可以同时执行这两个操作:在实类型上定义Ref,但不需要包含包含该类型的标头?

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

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

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

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

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

这可能是正确的方法。将前向声明添加到上述/封闭命名空间中的,并将其放在标题中。Ref模板别名确实是这里的最佳解决方案,完全满足了这两个条件。
template<class T> using Ref = std::shared_ptr<T>;