2

とても簡単な質問ですが、場合によってはどちらかを選択するという一般的なルールが見つからないようです。

Point次のような単純なクラスがあるとしましょう。

class Point
{
public:
    Point();
    Point(double, double, double);

    Point(const Point& other);
    Point& operator=(const Point& other);

    bool operator==(Point& lhs, Point& rhs);

    void translate(double, double, double);

    double getX() const;
    double getY() const;    
    double getZ() const;

    void setX(const double);
    void setY(const double);
    void setZ(const double);

private:
    double x_, y_, z_;
}

すべてうまくいきましたが、public x、y、zを使用して構造体にし、コードの半分を保存してみませんか?

別の例では、次のHeaderような構造体があるとします。

struct Header
{
    short int id;
    short int version;        
    size_t indexOffset;
    size_t indexSize;
}

どのような状況でクラスにしたいですか?また、上記と私がこのような品質コードで見たものとの間に違いはありますか?

class Header
{
public:
    short int id;
    short int version;        
    size_t indexOffset;
    size_t indexSize;
}

したがって、これに対するサブ質問は、メンバー変数をプライベートにするタイミングをどのように決定するかということだと思います。OOの純粋主義者はおそらく常に言うだろうと私は知っていますが、その利点についてはよくわかりません。

どうもありがとう。

4

2 に答える 2

2
regarding class vs. struct :

メンバー関数が不要な場合は struct を使用し、それ以外の場合はクラスを使用します。

regarding getters and setters :

メンバーに直接アクセスする必要がある場合は、メンバーを公開します。それらをプライベートにしてゲッター/セッターを介してアクセスする唯一の理由は、それらにアクセスするときに、有効性のチェックや他の依存メンバーの再計算など、何らかの処理を実行する必要がある場合です。

于 2012-11-24T17:13:39.177 に答える
0

Bo Persson によって提供されたリンクのおかげで、以下が関連する回答であることがわかりました。

構造体のメンバーと基本クラスは既定でパブリックですが、クラスでは既定でプライベートになります。注: デフォルトに依存するのではなく、基底クラスを明示的に public、private、または protected にする必要があります。

それ以外の場合、構造体とクラスは機能的に同等です。

OK、きしむようなクリーンなテクノトークはもう十分だ。感情的には、ほとんどの開発者はクラスと構造体を明確に区別しています。構造体は、カプセル化や機能がほとんどないビットの開いた山のように単純に感じられます。クラスは、インテリジェントなサービス、強力なカプセル化の障壁、および明確に定義されたインターフェイスを備えた、社会の生きた責任あるメンバーのように感じられます。これはほとんどの人がすでに持っている意味合いであるため、メソッドがほとんどなく公開データを持つクラスがある場合は、おそらく struct キーワードを使用する必要があります (そのようなものは、適切に設計されたシステムに存在します!)。それ以外の場合は、おそらくクラスを使用する必要がありますキーワード。

どちらのスタイルを使用するかは、状況と好みによって異なります。私は通常、すべてのデータが公開されているクラスに構造体を使用することを好みます。私はそのようなクラスを「適切な型ではなく、単なるデータ構造です。

ソース:
http://www.parashift.com/c++-faq/struct-vs-class.html
http://www.amazon.com/dp/0201700735/?tag=stackoverfl08-20

于 2012-11-24T17:12:01.477 に答える