4

クラス内のデータはプライベートにする必要があることを知っており、ゲッターとセッターを使用してそれらを読み取り/変更します。student.scores.push_back(100)でも、メンバー関数を保存するのに直接使うより面倒じゃないですか。

class Student {
public:

    void addToScores(int inScore) {

        scores.push_back(inScore);
    }

private:

    vector<int> scores;
}

要するに、人々が実際に実際に何をしているのか、ゲッターとセッターを使用して常に厳密にプライベートデータに興味がありますか?

4

4 に答える 4

4

メンバー関数の目的は、インターフェイスを公開することです。メンバーによって既に実装されているインターフェイスを集約コンテナー オブジェクトに単に移動するために、ゲッターとセッター、またはその他の簡単な関数を作成する必要はありません。

のクライアントが好きなStudentように操作できるようにする必要がある場合は、パブリック メンバーを作成して、簡単な方法でアクセスする必要があります。、、およびのみのスタックである必要がある場合は、インターフェイス アダプタを使用します。のみを許可する必要がある場合は、 を実装できます。しかし、唯一のクライアントがあなたであり、インターフェースの他の部分が悪用される心配がない場合、新しいインターフェースを実装する意味はありません。scoresscorespushpoptopstd::stackpush_backaddToScoresstd::vector

プログラム内のすべてのインターフェイスは、慎重に設計する必要があります。標準インターフェイス (C++ の既定の代入演算子を含む) は「危険」であるため、習慣としてスラップダッシュ インターフェイスを追加することは、必ずしも良い習慣ではありません。

于 2013-04-13T04:51:20.840 に答える
2

実際には、クラスを使用して、データメンバーから独立した新しいセマンティクスを持つ新しいデータ型を定義します。アクセサーもパブリック データ メンバーも使用されませんが、代わりに、データ メンバーの不変条件を維持しながら、新しいデータ型に関連するタスクを実行するメンバー関数が提供されます。

もちろん、セマンティクスを追加せずに、単なるデータの集合体であるクラスを作成する人もいます。この場合、structパブリック メンバーで満たされた が適切です。

于 2013-04-13T04:40:32.803 に答える
2

Get/Set メソッドを使用する基本的な理由の 1 つは、データのカプセル化以外に入力タイプを制御することです。

特定の入力タイプを取りたくない場合、たとえば、[0,100] 間隔の範囲外のスコアが必要ない場合は、Set メソッドでこの条件をチェックして、ライブラリ ユーザーが非論理的な操作を行うことができないようにすることができます。

于 2013-04-13T08:31:58.707 に答える
0

単純な読み取り/書き込みの場合は、データを非公開にする必要はありません。ただし、読み取り/書き込み対象のデータに対して行う必要がある検証/条件がある場合は、データを非公開にするのが理にかなっています。

于 2013-04-13T04:50:56.780 に答える