是否可以绕过循环依赖?
Is it possible to navigate around the circular dependency?
奇怪且可能很愚蠢的问题。
作为一个小型项目,我一直致力于创建一个 Ptr
class 来复制指针的机制 - 用户应该 理论上能够使用它class 就像一个没有问题的真正指针,不需要与“实际”C++ 指针交互(除了一些明显的语法更改)。 “记忆库”是一个非常大的字符数组。我已经设法将它的某个版本实现为一个工作原型,但是我在让它对创建数据结构有用时遇到了很多麻烦——比如,二叉搜索树。
说我有一个简化的 Ptr
class:
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
class 不是实际的指针。
我浏览了各种论坛,我很确定我要求的是不可能的。但无论如何我确实想确定一下:有没有什么办法可以在不强迫用户使用“真实”指针的情况下完成这项工作? 我也很高兴听到任何可以帮助我使用自行创建的 Ptr
class.
制作 BST 的重组技巧
编辑:Link 准确编译错误:https://godbolt.org/z/rhh15xYK8
您的问题不是循环依赖,而是您的 Ptr
class 包含元素而不是指针这一事实。所以你的 tree_node
需要包含自己的两个完整副本!这在技术上是不可能的。
为了使代码有意义并进行编译,您只需要将 Ptr
变成指针的实际包装器而不是副本的包装器。
template<typename T>
class Ptr
{
public:
Ptr<T>(){}
T* _a_item;
};
不,你不能明智地避免使用指针——我也看不出其中有任何意义。您可以用全局数组中的索引替换指针——但这只会使事情复杂化。它只是带有额外步骤的指针。
奇怪且可能很愚蠢的问题。
作为一个小型项目,我一直致力于创建一个 Ptr
class 来复制指针的机制 - 用户应该 理论上能够使用它class 就像一个没有问题的真正指针,不需要与“实际”C++ 指针交互(除了一些明显的语法更改)。 “记忆库”是一个非常大的字符数组。我已经设法将它的某个版本实现为一个工作原型,但是我在让它对创建数据结构有用时遇到了很多麻烦——比如,二叉搜索树。
说我有一个简化的 Ptr
class:
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
class 不是实际的指针。
我浏览了各种论坛,我很确定我要求的是不可能的。但无论如何我确实想确定一下:有没有什么办法可以在不强迫用户使用“真实”指针的情况下完成这项工作? 我也很高兴听到任何可以帮助我使用自行创建的 Ptr
class.
编辑:Link 准确编译错误:https://godbolt.org/z/rhh15xYK8
您的问题不是循环依赖,而是您的 Ptr
class 包含元素而不是指针这一事实。所以你的 tree_node
需要包含自己的两个完整副本!这在技术上是不可能的。
为了使代码有意义并进行编译,您只需要将 Ptr
变成指针的实际包装器而不是副本的包装器。
template<typename T>
class Ptr
{
public:
Ptr<T>(){}
T* _a_item;
};
不,你不能明智地避免使用指针——我也看不出其中有任何意义。您可以用全局数组中的索引替换指针——但这只会使事情复杂化。它只是带有额外步骤的指针。