関数に渡されるパラメータの長いリストを保持するクラスを作成します。この短い例を使用してみましょう。
class ParamList{
public:
ParamList(string& a_string);
string& getString(); //returns my_string
private:
string& my_string;
}
私の質問はこれです: my_stringはプライベートですが、参照を返します。C++でリークしているプライベートポインターのようなものを呼び出していませんか?これは良いプログラミング習慣ではありませんか? getStringの呼び出し元が参照を取得し、それを変更できるようにしたいと思います。
私にお知らせください。
ありがとう、 jbu
edit1:呼び出し元はgetString()を使用して、返された文字列を変更します。
回答:
回答№1の場合は3プライベートリファレンスの再取得は、次の条件を満たせばまったく問題ありません。
A.それは const
参照、およびその参照を無効にできる場合、または
B.その参照は変更することを意図しています(つまり、 std::vector<T>::operator[]
)
非const参照を返す便利なケースがありますが、通常は避ける必要があります。これは スコットマイヤーズ」効果的なC ++ (第3版、項目28):見たい場合は、オブジェクトの内部に「ハンドル」を返すことは避けてください。
回答№2については2
まず、ParamListが文字列を所有するのか、それとも「それについて知る」のかを決定する必要があります。あなたがそれを書いた方法 string& my_string
、それは単に他の誰かの文字列へのハンドルを持っていることを意味します。その場合、ParamListはそもそもそれを所有していないので、文字列を変更することは問題ではありません。
ParamListにパラメーターの完全なマスターコピーを持たせたい場合(解決しようとしている問題によって異なります)、次のようにします。
class ParamList{
public:
ParamList(const string& a_string); // do a strcpy in here.
const string& getString(); //returns my_string
void setString(const string& new_string); //do a strcpy here too.
private:
string my_string;
}
ParamListがメンバーの変更方法をもう少し制御できるように、非const参照を返すよりも、set関数とget関数を使用することをお勧めします。