2011-10-21 4 views
1

私は自分自身のWindows APIラッパーを開始していますが、C++機能を組み込むように構造を書き直しながら、慣れ親しんだトピックを実行しました。データメンバーをどこからでもアクセスできるようにしますが、読み取り専用

私はこの回している:私の唯一の問題は、ユーザが

Rect myRect; 
myRect.right = 50; 

を言っていたならば、それは右サイドを設定することで、

#define RECT_POS 1 
#define RECT_SIZE 2 

typedef struct WrapperRect // RECT 
{ 
    WrapperRect(); // all 0 
    WrapperRect (const double, const double, const double, const double, bool = RECT_POS); // initalize with tl pos and either br pos or size 

    bool set (const double, const double, const double, const double, bool = RECT_POS); // set tl pos and either br pos or size 
    bool pos (const double, const double); // set tl pos 
    bool size (const double, const double); // set size 

    WrapperRect & operator= (const WrapperRect &); // assign another rect 
    bool operator== (const WrapperRect &); // check for equality (pos+size) 
    bool operator!= (const WrapperRect &); // check for inequality (pos+size) 
    bool operator> (const WrapperRect &); // check for tl pos greater 
    bool operator< (const WrapperRect &); // check for tl pos less 
    bool operator>= (const WrapperRect &); // check for tl pos greater equal 
    bool operator<= (const WrapperRect &); // check for tl pos less equal 
    WrapperRect & operator+ (const POINT &); // move down/right 
    WrapperRect & operator- (const POINT &); // move up/left 
    WrapperRect & operator+= (const POINT &); // move down/right 
    WrapperRect & operator-= (const POINT &); // move up/left 

    double l, left, x; // left 
    double r, right; // right 
    double t, top, y; // top 
    double b, bottom; // bottom 

    double w, width; // width 
    double h, height; // height 
} Rect, rect; // allow more convenient names 

typedef struct _RECT { 
    LONG left; 
    LONG top; 
    LONG right; 
    LONG bottom; 
} RECT, *PRECT; 

を右側またはエイリアスのエイリアスを変更することはできません。

私は

cout << myRect.x; 

構文ではなく、迷惑

cout << myRect.getX(); 

構文をしたいので、メンバーはいずれかのプライベートになりたくありません。
これを達成する方法はありますか、またはget関数を使用する必要がありますか?

編集:
私はこれを書いたとき、私はいくつかの戻り値(>。>)を追加し、演算子+などの倍精度をポイントに変更しました。私はそれを受け入れる前に可能性を試しています。

答えて

1

データメンバーを公開することは非常に悪いことです。あなたのクラスの中にまったく同じ情報を複数コピーすることは、本当に悪いことです。これは、非効率的でバグが発生しやすい。

あなたは間違いなくアクセサー関数を使用する必要があります。

つまり、あなたはgetX()を持つ必要はありません。 - ちょうどx()は問題ありません。

あなたが本当に関数の構文を避けるに設定されている場合は、このようなものがOKだろう私が推測:あなたはまだ多少実装をさらしているものの

struct Rect 
{ 
private: 
    double l, r, t, b; 

public: 
    const double &x, &y; 

    Rect() : x(r), y(t) {} 

    ...etc. 
}; 

次に、あなたは安全な方法でr.xを使用することができます。

+0

定義文から愚かなエラーが出た後、私はついにそれをコンパイルしてくれました。ここの悪い習慣を心配しないでください。私は自分の小さなプログラム開発のためだけに使っています。 – chris

+0

公開されているconst参照をconst_castで読み書き可能にすることができます。 – jvstech

+0

また、 'const volatile'でなければならないことに注目する価値があります。揮発性がなければ、あなたのコンパイラは逆の順序で論理的に現れる他の書込みの前に "read of x"を動かすかもしれません。 – Daniel

0

get関数を使用する必要があります。あなたはあなたが望む構文を望んでいません。

たとえば、後で関数を変更して、xとyの両方の値をいくつかの複雑な構造にエンコードするとします。 myRect.xはどのように動作させますか?

xの値を取得することはまれです。だから、そうしなければ計算したくないのです。 myRect.xはどのように動作させますか?

将来、ある時点で、xに何回アクセスしたかを数える必要があります。 myRec.xはどのように動作させますか?

使用あなたはそれがクラス内で保存されているかを理解するために、xの値を取得したいコードを強制しないように機能を取得します。

0

定数ポインタを使用できます。 const double * xPtr;コンストラクタでそれを初期化します:xPtr = &xこれはxを変更するために使用することができないxへのポインタを作成します。 x値を変更するには、確かにセッター機能が必要です。

指摘されているように、これは悪い習慣であり、あなたはプライベートメンバーとクラスを使用して、より良いオフにしている、アクセサなど

constポインタ型は、ここで参照:

http://www.codeguru.com/cpp/cpp/cpp_mfc/general/article.php/c6967

0

この私には多くのコーディングクレジットを得ることはできないかもしれませんが、実際にはだとは思わないでしょう。あなたが作成しているものが直接データにアクセスするのは悪いスタイルです。より高いインテリジェンスのレベル。だからあなたの質問への答えは、あなたがこれを行うと、その後、時間のアクセスと高さへのアクセスは、実際にメモリ内の同じ場所にアクセス

struct rect 
{ 
    union 
    { 
     double width; 
     double w; 
    }; 

    union 
    { 
     double height; 
     double h; 
    }; 
} 

組合を使用することです。

関連する問題