ポインターの配列を持つクラスがあり、ポインターを逆参照して参照として返すメソッドがあるとします。メソッドの呼び出し元が、ポインターが指しているオブジェクトの非 const メソッドを呼び出せるようにしたいだけでなく、ポインターが指しているオブジェクトを変更する呼び出し元から自分自身を保護したいと考えています。const 参照を返す場合、ポインター オブジェクトのメソッドの多くを const としてマークする必要があるため、そのクラス メンバー変数の多くを可変としてマークする必要があります。
- これは悪い習慣ですか?もしそうなら、どうすればこれを回避できますか?
- ミュータブルを使いすぎるとパフォーマンスが低下しますか?
例:
#include <iostream>
#include <array>
#include <memory>
class Counter
{
public:
Counter();
void hit() const;
void reset();
unsigned count() const;
private:
mutable unsigned count_;
};
Counter::Counter() : count_(0) {}
void Counter::hit() const { ++count_; }
void Counter::reset() { count_ = 0; }
unsigned Counter::count() const { return count_; }
class CircularArray
{
public:
CircularArray();
const Counter& next() const;
private:
mutable unsigned i_;
std::array<std::unique_ptr<Counter>, 3> arr_;
};
CircularArray::CircularArray() : i_(2)
{
arr_[0] = std::unique_ptr<Counter>(new Counter);
arr_[1] = std::unique_ptr<Counter>(new Counter);
arr_[2] = std::unique_ptr<Counter>(new Counter);
}
const Counter& CircularArray::next() const { return *arr_[(i_ = (i_ + 1) % 3)]; }
int main()
{
CircularArray circular;
const Counter* p;
p = &circular.next();
p->hit();
p->hit();
Counter c;
//*p = c; // <-- Want to prevent this
}