使数据成员在任何地方都可访问,但只读

时间:2011-10-21 02:50:17

标签: c++ oop

我刚刚开始使用自己的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更改为一个点。在我接受之前,我开始尝试各种可能性。

4 个答案:

答案 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和访问高度实际上访问内存中的相同位置。