我刚刚开始使用自己的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函数?
编辑:
我真的没想到我写这篇文章时,我添加了一些返回值(&gt;。&gt;)并将运算符+等中的double更改为一个点。在我接受之前,我开始尝试各种可能性。
答案 0 :(得分: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
,尽管你仍然在某种程度上暴露你的实现。
答案 1 :(得分:0)
你应该使用get函数。您不需要您声称想要的语法。
例如,假设您稍后更改函数以将x和它们的y值一起编码为一些复杂的结构。你如何让myRect.x
工作呢?
假设检索x
的值很少见。因此,除非必须,否则您不想计算它。你如何让myRect.x
工作呢?
在将来的某个时候说,您需要计算访问x
的次数。你如何让myRec.x
工作呢?
使用get函数,这样就不会强制只想获取x值的代码来理解它是如何存储在类中的。
答案 2 :(得分:0)
您可以使用常量指针。 const double * xPtr;
然后在构造函数中初始化它:xPtr = &x
这将创建一个指向x
的指针,该指针不能用于修改x
。你肯定需要一个setter函数,但要改变值x
本身。
正如已经指出的那样,这是不好的做法,你最好使用私人会员,访问者等课程。
const
指针类型在这里引用:
http://www.codeguru.com/cpp/cpp/cpp_mfc/general/article.php/c6967
答案 3 :(得分:0)
这可能不会给我带来很多编码信誉'但我实际上并不认为当你创建的内容非常类似于ac结构时,直接访问成员是这样的坏风格主要负责存储数据,而不负责更高级别的智能。所以你的问题的答案是使用联合
struct rect
{
union
{
double width;
double w;
};
union
{
double height;
double h;
};
}
执行此操作时,访问h和访问高度实际上访问内存中的相同位置。