Допустим, у меня есть класс:Работа с ленивым вычисления в классах C++
class NumberCollection
{
public:
typedef std::set<int> SetType;
typedef SetType::iterator iterator;
void insert(int n);
iterator begin();
iterator end();
size_t size() const;
iterator difficultBegin();
iterator difficultEnd();
size_t difficultSize() const;
private:
SetType easySet_, difficultSet_;
}
Где insert()
добавляет элемент easySet_
. difficultSet_
членов группы изменяется в зависимости от членов easySet_
.
Проблема, которую я испытываю, заключается в том, что множественные вставки означают, что difficultSet_
постоянно пересчитывается. Поэтому я хочу, чтобы difficultSet_
рассчитывался лениво (т. Е. Только тогда, когда вызываются difficultBegin()
, difficultEnd()
или difficultSize()
). Проблема в том, что мне действительно нужно сделать difficultSet_
в mutable
, потому что иначе difficultSize()
не может работать на нем.
Так что теперь мой класс заявление выглядит как
class NumberCollection
{
public:
typedef std::set<int> SetType;
typedef SetType::iterator iterator;
void insert(int n);
iterator begin();
iterator end();
size_t size() const;
iterator difficultBegin();
iterator difficultEnd();
size_t difficultSize() const;
private:
SetType easySet_;
mutable SetType difficultSet_;
mutable bool upToDate_;
}
Я чувствую, что это плохой дизайн, хотя. Есть ли способ лучше?
Почему вы объявляете метод difficultSize() с константным ключевым словом? Есть ли для этого особая причина? – Wacek
@Wacek: Потому что это должно быть возможным для метода, который принимает параметр NumberCollection const &, чтобы вызвать трудныйSize() (я полагаю). Но вы правы, вы можете «понизить» этот метод до неконстантного, чтобы тот факт, что он может обновить кэшированное представление более явным. –
Бывают случаи, когда мне нужно вызвать трудноеСистему() для ссылки на константу, и логически проверка размера не изменяет объект. – rlbond