C ++のクラスでアルゴリズムをラップするときに、constの正確性に問題が生じることがよくあります。許可されていませんが、可変関数が欲しいと思います。次のようなクラスの実装方法を教えてもらえますか?
以下は私が書き たいコードです。
- run()関数は、データを変更するため、const関数であってはなりません。
- 関数get_result()は、データを返すため、(ユーザーに関する限り)定数関数である必要があります。
ただし、ユーザーがrun()を呼び出さずに結果を要求した場合は、get_result()関数でアルゴリズムを実行する必要があります。非const関数を呼び出すconst関数があるため、これはconstの正確性を損ないます。
class operate_on_data
{
std::vector<double> m_data; // the data to modify
bool m_completed; // check to see if the function run() has been called
public:
operate_on_data(std::vector<double> data)
: m_data(data), m_completed(false) {} //initialise
void run() //I don't want this function to be const
{
//The algorithm goes here - it alters m_data.
m_completed = true; //the algorithm has been run
}
std::vector<double> get_result() const //I want this function to be const
{
/*The following breaks const correctness because
I am calling a non-const function from a const function
- but this feels like the right thing to do ... */
if (!m_completed) run(); //run the algorithm if it has not run already
return m_data; //return
}
};
上記のクラスをコンパイルすることができた唯一の方法は、次のいずれかです。
- run()をconstにし、m_dataとm_completedを可変にします。これは機能しますが、run()が明らかにデータを変更するため、概念的には間違っています。
- get_result()を定数関数にしないでください。これも間違っているように見えます。ユーザーは、この関数が単純な戻り値であり、したがって一定であると期待するからです。
- run()関数をget_result()const関数に入れ、データ変数を変更可能にします。
私の理解では、mutableキーワードはこれらのオプションの3番目用に設計されており、実装ではデータを変更する必要がありますが、ユーザーは単純な戻り値、したがってconst関数を合理的に期待しています。
ただし、ユーザーがデータを変更するタイミングを正確に選択できるようにするため、この最後のオプションは実行しません。ただし、run()の呼び出しを忘れる可能性があるため、run()を呼び出さずに結果を要求した場合は、アルゴリズムを強制したいと思います。run()を可変にしたいように感じますが、許可されていません。
そのようなクラスを書く正しい方法は何ですか?