Disons que j'ai une classe:Traiter avec le calcul paresseux dans les classes de 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_;
}
Où insert()
ajoute un élément à easySet_
. Les membres de difficultSet_
changent en fonction des membres de easySet_
.
Le problème que j'ai est que, insertions multiples signifie que difficultSet_
est constamment recalculé. Je veux donc que difficultSet_
soit calculé paresseusement (c'est-à-dire seulement lorsque difficultBegin()
, difficultEnd()
, ou difficultSize()
sont appelés). Le problème est, alors je dois effectivement faire difficultSet_
dans un mutable
parce que sinon difficultSize()
ne peut pas fonctionner sur elle.
Alors maintenant ma déclaration de classe ressemble
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_;
}
Je me sens comme cela est une mauvaise conception bien. Y a-t-il un meilleur moyen?
Pourquoi ne vous déclarez méthode difficultSize() avec mot-clé const? Y a-t-il une raison particulière à cela? – Wacek
@Wacek: Parce qu'il devrait être possible pour une méthode qui prend un const & NumberCollection d'appeler difficileSize() (je présume). Mais vous avez raison, vous pouvez "rétrograder" cette méthode à non-const pour rendre le fait qu'elle puisse mettre à jour la représentation en cache plus explicite. –
Il y a des cas où j'ai besoin d'appeler difficileSize() sur une référence const, et logiquement, vérifier la taille ne change pas l'objet. – rlbond