Сделать элемент данных доступным везде, но только для чтения - PullRequest
1 голос
/ 21 октября 2011

Я только запускаю свою собственную оболочку 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?

edit:
Я действительно не думал, когда писал это, я добавил некоторую отдачузначения (>.>) и изменили удвоение в операторе + и т.д. до точки.Я начинаю пробовать возможности, прежде чем принять один.

Ответы [ 4 ]

1 голос
/ 21 октября 2011

Это очень плохая практика выставлять ваши данные членам.Также очень плохо иметь несколько копий одной и той же информации в ваших классах.Он неэффективен и подвержен ошибкам.

Вам определенно нужно использовать функции доступа.

При этом вам не нужно иметь 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 голосов
/ 22 января 2014

Это может не заработать мне много баллов за кодирование, но я на самом деле не думаю, что это такой плохой стиль для прямого доступа к членам, когда то, что вы создаете, очень похоже на ac structотвечает главным образом за хранение данных и не несет ответственности за более высокий уровень интеллекта.Таким образом, ответ на ваш вопрос заключается в использовании объединения

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

    union
    {
        double height;
        double h;
    };
}

Когда вы это сделаете, тогда доступ к h и доступ к высоте фактически получат доступ к одному и тому же месту в памяти.

0 голосов
/ 21 октября 2011

Вы можете использовать постоянный указатель.const double * xPtr; затем инициализируйте его в конструкторе: xPtr = &x это создает указатель на x, который нельзя использовать для изменения x.Вам определенно потребуется функция установки, хотя для изменения самого значения x.

Как уже отмечалось, это плохая практика, и вам лучше использовать класс с закрытыми членами, средствами доступа и т. Д.

const ссылки на типы указателей здесь:

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

0 голосов
/ 21 октября 2011

Вы должны использовать функции get. Вы не хотите, чтобы синтаксис, который вы утверждаете, вы хотите.

Например, предположим, что вы позже измените функцию для кодирования значений x и y вместе в некоторую сложную структуру. Как вы заставите myRect.x работать тогда?

Скажем, получение значения x встречается редко. Таким образом, вы не хотите вычислять это, если вам не нужно. Как вы заставите myRect.x работать тогда?

Скажем, в какой-то момент в будущем вам нужно посчитать, сколько раз был обращен x. Как вы заставите myRec.x работать тогда?

Используйте функции get, чтобы не вызывать код, который просто хочет получить значение x, чтобы понять, как он хранится внутри класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...