gpt4 book ai didi

c++ - 此类设置是否违反 Liskov 替换原则

转载 作者:行者123 更新时间:2023-11-28 04:35:37 25 4
gpt4 key购买 nike

我有一棵树的这段代码。 BST 节点包含实际数据。 BST 是它们的包装器,继承自 unique_ptr<BSTnode<Key,Data>> . BST 不会向类中添加任何新字段。

继承使得我的树是 unique_ptr<BSTnode> ,但这是实现它的正确方法吗?为 BST 添加的操作,如 rotate()/insert() 或 remove() 是特定于数据结构的。您不会也不应该期望它们具有常规的 unique_ptr,但这确实意味着 BST 不能与 unique_ptr 互换使用。

如果这个实现策略不对,应该怎么解决?

template <class Key, class Data>
class BST : public unique_ptr<BSTnode<Key, Data>>
{
using unique_ptr<BSTnode<Key, Data>>::unique_ptr;
// operations ...
};

template <class Key, class Data>
class BSTnode
{
friend class BST<Key, Data>;

public:
//constructors ...

protected:
Key key;
Data data;
BSTnode<Key, Data> *parent;
BST<Key, Data> left, right;
};

最佳答案

撇开 LSP 不谈,继承标准类通常是有问题的,在大多数情况下不是推荐的解决方案。在这种情况下,正如@SomeProgrammerDude 建议的那样,最好使用组合并将指针放在类中:

template <class Key, class Data>
class BST
{
std::unique_ptr<BSTnode<Key, Data>> root;
// operations ...
};

无论如何,没有人会想要使用您的 BST 类来替换 unique_ptr。它是一个单独的数据容器,恰好利用 unique_ptr 来存储其数据。

关于c++ - 此类设置是否违反 Liskov 替换原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51555181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com