(首先,对不起我的英语)
为了避免循环依赖的句法限制,我想知道下面提出的解决方案是否真的是一个解决方案,或者它是否有比冒险更多的缺点(假设这种相互依赖是不可避免的):
原来情况:
class B;
class A
{
B needed;
};
class B {};
输出:
B has an incomplete type.
“解决方案”:
template<typename T = class B>
class tricky_A
{
static_assert(is_same<T, B>::value, "Too tricky!!");
T needed;
};
class B {};
using A = tricky_A<>;
int main()
{
A a; // At the instantiation point, B isn't an incomplete type.
}
输出:
No problems.
常见的解决方案是使用指针,但是当你真的不需要它们时,我看到了两个问题:
1)如果您决定保留指向其他本地对象的指针,您应该确定(或您的类的用户应该确定)您的对象的生命周期比“保留”对象的生命周期短。
2)如果你决定处理动态内存,你应该花时间保留和销毁内存,而且它迫使你处理异常处理,以使你的代码异常安全。
*) 更长的代码;较小的可读性;更难的保养;等等
我应该使用这个“解决方案”还是更好地搜索另一个?
编辑:你没事。这不是真正的循环依赖,所以没有什么可问的。这个问题可以关闭。
EDIT2: 一个更好的问题在这里。