2009-02-26 8 views

Répondre

7

Ce serait avec le mot-clé « mutable ».

class X 
{ 
public: 
    bool GetFlag() const 
    { 
     m_accessCount++; 
     return m_flag; 
    } 
private: 
    bool m_flag; 
    mutable int m_accessCount; 
}; 
+0

Cela fonctionne pour les entiers, mais si elle est un itérateur à une liste ou une carte cela ne fonctionne pas sur des objets const. Il jette une erreur à iter = list.begin() en disant pas d'opérateur "=" disponible. –

+0

@tmpforspam: Sans être en mesure de voir le message d'erreur complet que vous obtenez, cela ressemble à « liste » est également const et vous devriez utiliser un const_iterator. –

3

Déclarez-le mutable, non volatil.

5

Êtes-vous sûr que vous avez besoin iterator en tant que membre? Les itérateurs ont une capacité: ils deviennent invalides. C'est un petit signe d'un problème de conception.

+0

Je veux parcourir une liste en utilisant des fonctions membres. getFirst et getNext genre de .... Mais pour cela, je veux déclarer un itérateur mutable afin que je puisse itérer sur les objets const. –

+1

optez pour le STL-Design des itérateurs. Il est accepté dans la communauté C++ et ne surprendrait pas les autres développeurs. Cela voudrait dire que l'itérateur ne fait pas partie de la classe. –

+0

@tmpforspam: si le comportement de votre objet change lors de l'appel de votre fonction membre, ce n'est pas une fonction const. – xtofl

-1

Got it.

using namespace std; 
class tmptest 
{ 
    public: 
    void getNextItr()const 
    { 
     m_listItr = m_list.begin(); 
     m_listItr++; 
    } 
    list<string> m_list; 
    mutable list<string>::const_iterator m_listItr; 
}; 

Mutable avec const_iterator fonctionne. Merci de me rappeler mutable versus volatile. Je suis volatile confondu avec mutable. Merci encore!

+0

Il s'agit d'une rupture de contrat sérieuse: après avoir appelé la fonction 'getNextItr()', le code client supposera que l'objet est toujours le même, mais ce n'est pas le cas. – xtofl