gpt4 book ai didi

c++ - 如何防止用继承的运算符[]赋值?

转载 作者:太空宇宙 更新时间:2023-11-04 14:40:51 27 4
gpt4 key购买 nike

我有一个名为 SortedArrayList<T> 的自定义结构它根据比较器对其元素进行排序,我想防止使用 operator[] 进行分配.

示例:

数组列表.h

template <typename T> class ArrayList : public List<T> {
virtual T& operator[](const int& index) override; //override List<T>
virtual const T operator[](const int& index) const override; //override List<T>
}

带有以下运算符的 SortedLinkedList.h

template <typename T> class SortedArrayList : public ArrayList<T> {
public:

SortedArrayList<T>(const std::function<bool(const T&, const T&)>& comparator);

T& operator[](const int& index) override; //get reference (LHS)
const T operator[](const int& index) const override; //get copy (RHS)
}

测试.h

ArrayList<int>* regular = new ArrayList<int>();
ArrayList<int>* sorted = new SortedArrayList<int>(cmpfn);

(*regular)[0] == 5; //allow
(*regular)[0] = 5; //allow
(*sorted)[0] == 7; //allow
(*sorted)[0] = 7; //except

这个操作可行吗?

我所说的阻止是指抛出异常或警告用户不要这样做的东西。

最佳答案

比继承更喜欢聚合:

template <typename T> class SortedArrayList {
ArrayList<T> m_the_list;
public:

SortedArrayList<T>(const std::function<bool(const T&, const T&)>& comparator);

const T& operator[](const int& index) const {return m_the_list[index];}; // always get const reference

// Can act as a *const* ArrayList<T>, but not as a mutable ArrayList<T>, as that would violate Liskov's substitution principle.
operator const ArrayList<T>&() const {return m_the_list;}
}

作为Stephen Newell正确points out ,当您使用继承时,您保证您的类 SortedArrayList 可以在所有可能的情况下充当 ArrayList。在您的示例中显然不是这种情况。

您可以阅读更多here关于违反 Liskov 替代原则是多么糟糕的想法。

关于c++ - 如何防止用继承的运算符[]赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50048932/

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