Я думаю, что ваш вопрос немного расплывчатый.
У вас есть:
bool has() const { return get().length(); }
string& get() { /* huge code here */ return s; }
... и нужно has()
, чтобы быть const
.
Я могу придумать три способа обойти это, в зависимости от того, что вы на самом деле пытаетесь сделать:
Самым чистым вариантом будет has
, чтобы использовать только код const
. Если некоторые из ваших /* huge code here */
кодов неконстантны, но фактически не изменяют логическое значение класса (например, вычисление кэшированного внутреннего значения) , рассмотрите возможность использования mutable
для задействованных данных .
Если часть /* huge code here */
не является константной по своей природе, рассмотрите возможность преобразования ее в другую функцию и вызова ее отдельно:
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
В конечном счете, вы также можете отбросить постоянство (но имейте в виду, что необходимость в этом почти всегда является признаком плохого дизайна / необходимости рефакторинга):
class A {
public:
bool has() const { return const_cast<A*>(this)->get().length(); }
string& get() { /* huge code here */ return s; }
private:
string s;
};