微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以绕过循环依赖?

如何解决是否可以绕过循环依赖?

奇怪且可能很愚蠢的问题。

作为一个小项目,我一直致力于创建一个 Ptr 类来复制指针的机制 - 用户应该理论上应该能够像使用真正的指针一样毫无问题地使用这个类并且不需要与“实际”C++ 指针交互(除了一些明显的语法更改)。 “内存存储”是一个非常大的字符数组。我已经设法将它的某个版本实现到一个工作原型中,但是我在让它对创建数据结构有用时遇到了很多麻烦 - 以二叉搜索树为例。

假设我有一个简化的 Ptr 类:

template<typename T>
class Ptr
{ 
   Ptr<T>(){}
   T _a_item;
};

一个简化的 tree_node 结构:

template <typename T>
struct tree_node
{
    T _item;
    Ptr<tree_node<T> > _left;
    Ptr<tree_node<T> > _right;
};

我猜你会立即发现循环依赖的明显问题,它会阻止编译。通常,tree_node 结构看起来像:

template <typename T>
struct tree_node
{
    T _item;
    tree_node<T>* _left;
    tree_node<T>* _right;
};

这样就好了。问题是我的 Ptr 类不是实际的指针。

我浏览了各种论坛,我很确定我所要求的是不可能的。但我确实想确保无论如何:有什么办法可以在不强迫用户使用“真实”指针的情况下完成这项工作? 我也很乐意听到任何可以帮助我使用自己创建的 Ptr 类制作 BST 的重组技巧。

编辑:链接到确切的编译错误https://godbolt.org/z/rhh15xYK8

解决方法

您的问题不是循环依赖,而是您的 Ptr 类包含一个元素而不是指针的事实。所以你的 tree_node 需要包含它自己的两个完整副本!这在技术上是不可能的。

要使代码有意义并进行编译,您只需要将 Ptr 变成指针的实际包装器,而不是副本的包装器。

template<typename T>
class Ptr
{ 
    public:
    Ptr<T>(){}
    T* _a_item;
};

不,你不能明智地避免使用指针——我也看不出有任何意义。您可以用全局数组中的索引替换指针 - 但这只会使事情复杂化。它只是带有额外步骤的指针。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。