Je pense que votre question est un peu vague.
Vous avez:
bool has() const { return get().length(); }
string& get() { /* huge code here */ return s; }
... et ont besoin has()
être const
.
je peux penser à trois façons de contourner cela, en fonction de ce que vous essayez vraiment faire:
L'option la plus propre serait pour has
d'utiliser uniquement le code const
. Si certains de vos /* huge code here */
code non-const mais ne change pas réellement la valeur logique de la classe (comme le calcul d'une valeur interne mise en cache) envisagez d'utiliser mutable
sur les données impliquées.
Si la partie /* huge code here */
est non const par nature, considère refactorisation dans une autre fonction et de l'appeler séparément:
using namespace std;
class A {
public:
bool has() const { return get().length(); }
const string& get() const { return s; }
void computestuff() { /* huge code here */ }
private:
string s;
};
A instance;
// old client code:
// string s = instance.get();
//
// new code:
instance.computestuff(); // non-const call
instance.get(); // const call
instance.has(); // const call
En fin de compte, vous pouvez également jeter le const-ness loin (mais gardez à l'esprit que la nécessité de le faire est presque toujours un signe de mauvaise conception/besoin de refactoriser):
class A {
public:
bool has() const { return const_cast<A*>(this)->get().length(); }
string& get() { /* huge code here */ return s; }
private:
string s;
};
Juste pour vous rappeler que les membres mutables peuvent être modifiés par const, s o il pourrait être logique d'avoir get() const (mais probablement de ne pas renvoyer un ref non const) même s'il doit y modifier s dans le code énorme. – AProgrammer
Quel genre d'effets secondaires obtenez-vous? –
Il modifie évidemment l'art. Sinon, le correctif trivial est 'return s.length()'. Par conséquent, 'has()' just is not const. – MSalters