【问题标题】:Is it possible to navigate around the circular dependency?是否可以在循环依赖中导航?
【发布时间】:2021-07-06 12:39:10
【问题描述】:

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

作为一个迷你项目,我一直在努力创建一个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

【问题讨论】:

  • 不,我没有发现任何妨碍编译的问题(除了 Ptrs 构造函数是私有的)。为我显示的代码compiles just fine
  • 对不起,这是我的错!忘记了 Ptr 类中的变量 - 这是新链接:godbolt.org/z/rhh15xYK8。我将编辑上面的帖子。
  • 您的代码没有意义。 ptr 类包含一个元素而不是指针。所以树节点需要无限大小,因为树节点不仅需要包含自身的副本,还需要包含自身的两个副本。
  • @ALX32z 我有一种感觉,这是真的。您是否有任何可能导致能够使用自创 Ptr 类创建 BST 的重组技巧?或者这是一项不可能完成的任务?
  • 只需让Ptr 包含一个指针而不是一个副本。

标签: c++ class pointers binary-search-tree circular-dependency


【解决方案1】:

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

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

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

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

【讨论】:

  • 似乎动机是将其用作学习练习,了解如何使用户定义的 C++ 类型像内置 C++ 类型一样(尽可能)
猜你喜欢
  • 2022-12-11
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多