我有一个名为 SortedArrayList
Một cấu trúc tùy chỉnh sắp xếp các phần tử của nó dựa trên bộ so sánh, tôi muốn ngăn việc sử dụng toán tử []
Thực hiện phân bổ.
Ví dụ:
danh sách mảng.h
mẫu lớp ArrayList : Danh sách công khai {
ảo T& operator[](const int& index) ghi đè; //ghi đè Danh sách
toán tử const T ảo[](const int& index) const ghi đè; //ghi đè Danh sách
}
SortedLinkedList.h với các toán tử sau
mẫu lớp SortedArrayList : public ArrayList {
public:
SortedArrayList(const std::function& bộ so sánh);
Ghi đè T& operator[](const int& index); //lấy tham chiếu (LHS)
const T operator[](const int& index) const ghi đè; //lấy bản sao (RHS)
}
kiểm tra.h
ArrayList* Regular = new ArrayList();
ArrayList* được sắp xếp = new SortedArrayList(cmpfn);
(*thông thường)[0] == 5; //cho phép
(*thông thường)[0] = 5; //cho phép
(*đã sắp xếp)[0] == 7; //cho phép
(*đã sắp xếp)[0] = 7; // ngoại trừ
Hoạt động này có khả thi không?
Bằng cách chặn, tôi muốn nói đến điều gì đó ném ra một ngoại lệ hoặc cảnh báo người dùng không làm điều đó.
Thích nó hơn là thừa kếsự trùng hợp:
mẫu lớp SortedArrayList {
ArrayList m_the_list;
public:
SortedArrayList(const std::function& bộ so sánh);
const T& operator[](const int& index) const {return m_the_list[index];} // luôn lấy tham chiếu const
// Có thể hoạt động như một *const* ArrayList, nhưng không hoạt động như một ArrayList có thể thay đổi, vì điều đó sẽ vi phạm nguyên tắc thay thế của Liskov.
toán tử const ArrayList&() const {return m_the_list;}
}
作为Stephen NewellChính xácchỉ ra , khi bạn sử dụng tính kế thừa, bạn đảm bảo rằng lớp của bạn Danh sách mảng được sắp xếp
có thể hoạt động như một ArrayList
. Đây rõ ràng không phải là trường hợp trong ví dụ của bạn.
Bạn có thể đọc thêmđâySuy nghĩ về việc vi phạm Nguyên tắc thay thế của Liskov sẽ tệ đến mức nào.
Tôi là một lập trình viên xuất sắc, rất giỏi!