私はまだC++だけでなく、オブジェクト指向のプログラミング自体について多くのことを学ぶ必要があると思います。最近のC++プロジェクトでは、私は非常に自由に1つの質問に出くわしました:あるオブジェクトにconst参照を渡す状況がある場合、そのオブジェクトの非const関数をどのように使うことができますか?const参照の非const関数を呼び出す場合は、正しいOOPデザインを使用しますか?
私は例をあげてみよう。今、私は、例えば、異なる専門知識を持つ別のクラスを持つインスタンスの
class Person
{
private:
float weight;
float height;
float age;
...
public:
float bodyMassIndex();
};
、私はそのデータの小さな計算でいくつかのデータと機能を持つクラスを持っていると言います
class GymInstructor
{
private:
float knowledge;
int age;
...
public:
int recommendDumbbellWeight(const Person &person);
};
は今機能GymInstructor::recommendDumbbellWeight
は、その計算に機能Person::bodyMassIndex()
を使用したいと言います。ここで
は+のローカルコピーを作成
Person
recommendDumbbellWeight
内部(そう
GymInstructor::recommendDumbbellWeight(Person person)
のようなものを避けるため)私はする必要はありません、それは私のプログラムが遅くなりますので
+
GymInstructor::recommendDumbbellWeight(Person *pPerson)
のようなもので指針を与える+私は読み込み専用のアクセスを控えているので、書き込みアクセスを与えて
recommendDumbbellWeight
に
+ Make Person :: bodyMassIndexを
const
という関数にするここではオブジェクトの
weight
および
height
。
+
Person
のデータを使用するため、関数
bodyMassIndex()
を他のクラスに移動するので、別のオブジェクトがその計算を実行する本当の理由はありません。もしそうなら、私はすべてのデータをその他のクラスに渡さなければなりません。
+ のような小さな計算結果をもっと多く必要とする場合は、
GymInstructor::recommendDumbbellWeight(float bodyMassIndex, float experience, float fitness, ...
のような計算結果を渡すのは避けてください。パラメータリストが醜いので不必要なコードが生成されるためです。
実際には何が残っていますか?私はをGymInstructor::recommendDumbbellWeight(const Person &person)
に電話したいと思いますが、person
はconst参照であるため、できません。
私は非常に明白な解決策を見るにはあまりにも愚かであるか、私の設計には根本的に何かが間違っていると思います。どうすれば問題を解決できますか?それはとにかく float bodyMassIndex() const;
"+ Person :: bodyMassIndexをオブジェクトの状態(ここでは体重や高さなど)に依存するため、Personをconst関数にします。 **これは非constの合理的な議論ではありません** string :: c_str()はconstであり、完全に状態に依存します。 –