2016-09-14 15 views
1

私はまだ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;

+2

"+ Person :: bodyMassIndexをオブジェクトの状態(ここでは体重や高さなど)に依存するため、Personをconst関数にします。 **これは非constの合理的な議論ではありません** string :: c_str()はconstであり、完全に状態に依存します。 –

答えて

3

ややそれがオブジェクトを変更しようとしないだろうという約束を作るようなものですconstメソッドの宣言ゲッターだからconstのよう

+0

ああ、関数を 'const'と宣言することによって、私はいつも' const float bodyMassIndex(); 'のようなものしか考えていませんでした。その混乱をお詫び申し上げます。 – hexcoffee

+0

さらに推測したいのであれば、非静的メソッドには "不可視"の '* this'パラメータがあり、メソッドのcv修飾子はそのパラメータに適用されると言えるでしょう – Ap31

0

宣言方法。オブジェクト状態へのアクセスを拒否することはなく、非constオブジェクトに対しても完全に呼び出すことができます。 だから解決策はfloat bodyMassIndex() const;

0

です。Person::bodyMassIndex()がconstであってはならないという要件は、不合理で非常にばかげています。 Person::bodyMassIndex()がconstであってはならない唯一の引数は、実際にがPersonオブジェクトの状態を変更するということです。それはしません。

Person::bodyMassIndex() non-constの最初の部分はバグです。クラスデザインのミス。

関連する問題