0

質問のタイトルが実際の質問を効果的に反映していない (またはまったく反映していない) 場合は、お詫び申し上げます。これは、stackoverflowで質問または回答するのが初めてで、間抜けになっている可能性があります...

とにかく、私の(精巧な)質問はこれです:

プライベート メンバー変数の使用を必要とするクラスでパブリック メンバー関数を定義する場合、それぞれ (プライベート変数) はパブリック メンバーの「ゲッター」関数を持ちます (「ゲッター/セッターを失う...」と答えないでください。それらを使用する)、より良いでしょうか-実際には「より良い」、C++コンパイラ間でクラスをより「拡張可能」にし、どのオプションがより多くの「前方互換性」を可能にするかなど-- this->m_variable を使用する OR this- を使用する- >getm_変数()?

私が現在取り組んでいるプロジェクトから、次のコード例 (Family という名前のクラスを作成する) を含めて、正確に何を意味するのかを明確にしようとしました。

Family.h のスニペット

private:
    Person* children; // array of Person objects - Person is a member struct
    size_t numChildren;

public:
    enum gender { NONE = 0, MALE, FEMALE }
    size_t countChildren() { return numChildren; }
    size_t countChildren(gender g);
    Person* getChild() { return children; }

Family.cpp のスニペット

// this is the specific function example:
size_t Family::countChildren(gender g) {
    for (size_t i = 0; i < this->numChildren; i++) {
        ...CODE TO COUNT CHILDREN OF SPECIFIED GENDER...
    }
    return # of children with gender g   // pseudocode, obviously...
}

したがって、例の質問が変更されました。

countChildren(gender g)私が持っている関数の定義では、i < this->numChildren;(前に述べたメトリックに関して) を使用する方が良いでしょうi < this->countChildren();か? 同様に、同じ for ループの子配列を反復処理する場合、OR を使用Person*して現在の反復でそれぞれを定義する方がよいでしょうか?*(this->children + i)*(this->getChild() + i);

先に述べたように、この質問がスタックオーバーフローにとって「ディスカッションベース」すぎる場合はお詫び申し上げます。これ初めての質問です。

4

2 に答える 2

1

理想的な世界では、常に getter を使用して論理プロパティを内部的に参照します。 これは、前述のプロパティが公開されることを意図している場合にのみ重要です。実装の詳細にのみ使用されるゲッターを書いていることに気付いた場合はprivate、コーディングをやめてコーヒーを飲んでから、自分が何をしているのかを考えてください。

内部でゲッターを使用する理由 同じ理由で、他の場所でも使用できます。クラスの表現の変化に対してより回復力があります。今回は他のコードだけでなく、このクラスも恩恵を受けています。

ひいては、これによりクラスの拡張が容易になります。 純粋な仮想( Java の方が好きな場合は )になりたい場合はどうすればよいでしょうか。また、異なるサブクラスに子のカウント方法を決定させる場合はどうすればよいでしょうか? countChildren(常にすべきabstractというわけではありませんが、可能です。 それは別の問題です。 )

また、「関数呼び出しによるパフォーマンス ヒット」とは言わないでください。特にゲッターが であるinlineか非である場合、おそらく最適化されますvirtual

実際の世界では、これが本当に重要かどうかは、他の何人があなたのコードを使用するか、またはクラスのデータ表現が変更される可能性が低いことがわかっているかどうかによって異なります (これは、数学的なベクトルのように、実際には合理的な期待である場合があります)。 .

于 2015-10-25T01:03:43.113 に答える
0

私の個人的な偏見: メンバー変数の代わりにメンバー関数を使用します。メンバー変数を別の方法で表現するか、Pimple イディオムを使用してヘルパー クラスに移動することにした場合は、変更するコードが少なくなります。

于 2015-10-25T00:48:44.090 に答える