我剛開始自己的Windows API封裝,並且在重寫包含C++特性的結構時遇到了陌生的主題。使數據成員無處不在,但只讀
我把這個:
typedef struct _RECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT, *PRECT;
到
#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
我唯一的問題是,如果用戶說
Rect myRect;
myRect.right = 50;
它將設置在右側,但無法更改右側或寬度的別名。
我不想成員是私有的或者是因爲我想
cout << myRect.x;
語法,而不是惱人
cout << myRect.getX();
語法。
有什麼辦法可以達到這個目的,還是我必須使用get函數?我真的沒有想到,當我寫這個,我已經添加了一些返回值(>。>),並將運算符+等中的雙改爲一個點。在接受之前,我開始嘗試各種可能性。
在定義語句出現一個愚蠢的錯誤後,我終於得到它的編譯,它工作得很好,謝謝。不要擔心這裏的不良做法;我只是將它用於我自己的小程序開發。 – chris
值得一提的是,暴露的const引用可以用const_cast讀寫。 – jvstech
同樣值得注意的是,它們應該是'const volatile'。如果沒有volatile,你的編譯器可能會在一些其他的寫入操作之前移動「讀取x」,否則邏輯上它會以相反的順序出現。 – Daniel