Tôi có một lớp bao gồm một std :: list và muốn cung cấp public start() và end() cho const_iterator và private start() và end() cho chỉ iterator đơn giản.Làm thế nào để cung cấp stl như container với iterator công cộng const và private-const iterator?
Tuy nhiên, trình biên dịch đang xem phiên bản riêng tư và khiếu nại rằng đó là riêng tư thay vì sử dụng phiên bản công khai const.
Tôi hiểu rằng C++ sẽ không quá tải trên kiểu trả về (trong trường hợp này là const_iterator và iterator) và do đó nó đang chọn phiên bản không const vì đối tượng của tôi không phải là const.
Việc rút ngắn đối tượng của tôi thành const trước khi gọi bắt đầu() hoặc không quá tải tên bắt đầu có cách nào để thực hiện việc này không?
Tôi cho rằng đây là một mẫu đã biết mà mọi người đã giải quyết trước đây và muốn theo dõi cách thức giải quyết vấn đề này.
class myObject {
public:
void doSomethingConst() const;
};
class myContainer {
public:
typedef std::list<myObject>::const_iterator const_iterator;
private:
typedef std::list<myObject>::iterator iterator;
public:
const_iterator begin() const { return _data.begin(); }
const_iterator end() const { return _data.end(); }
void reorder();
private:
iterator begin() { return _data.begin(); }
iterator end() { return _data.end(); }
private:
std::list<myObject> _data;
};
void myFunction(myContainer &container) {
myContainer::const_iterator itr = container.begin();
myContainer::const_iterator endItr = container.end();
for (; itr != endItr; ++itr) {
const myObject &item = *itr;
item.doSomethingConst();
}
container.reorder(); // Do something non-const on container itself.
}
Các lỗi từ trình biên dịch là một cái gì đó như thế này:
../../src/example.h:447: error: `std::_List_iterator<myObject> myContainer::begin()' is private
caller.cpp:2393: error: within this context
../../src/example.h:450: error: `std::_List_iterator<myObject> myContainer::end()' is private
caller.cpp:2394: error: within this context
Cảm ơn.
-William
Theo tôi thấy không có thừa kế trong mã của bạn, có lẽ bạn nên sửa 'Tôi đang phát sinh một lớp riêng tư'. –
Rất tiếc, các chỉnh sửa đã không được đồng bộ hóa, cảm ơn bạn đã chỉ ra rằng nó đã được chỉnh sửa ngay bây giờ. – WilliamKF
Nếu không bắt đầu và kết thúc không phải của bạn là riêng tư đối với vùng chứa của bạn, tại sao bạn muốn cung cấp các chức năng riêng cho chúng? Tại sao không chỉ sử dụng các trình vòng lặp danh sách một cách trực tiếp. – AraK