Можете ли вы использовать методы доступа в перегруженных операторах? - PullRequest
0 голосов
/ 10 февраля 2012

Так что меня всегда учили, что хорошей практикой кодирования является использование методов доступа вместо прямого доступа к переменным-членам, однако при написании перегруженных операторов я не могу скомпилировать, если использовать эти методы доступа в определении класса операторов. Итак, предположим следующий класс:

    class Point
    {
    public:
        Point() {};
        virtual ~Point() {};

        // Accessor Methods
        inline void SetX(ushort nX) { m_nX = nX; }
        inline void SetY(ushort nY) { m_nY = nY; }
        inline ushort GetX() { return m_nX; }
        inline ushort GetY() { return m_nY; }

        // Overloaded Operators
        Point operator+(const Point& pnt);

    private:
        ushort m_nX, m_nY;
    };

В определении оператора следующее кажется совершенно законным, но это противоречит тому, чему меня учили:

    Point Point::operator+(const Point& pnt)
    {
        Point myPoint;
        myPoint.SetX(GetX() + pnt.m_nX);
        myPoint.SetY(GetY() + pnt.m_nY);
        return myPoint;
    }

Однако следующие ошибки компилируются с ошибкой:

Point.cpp: 7: 36: ошибка: передача 'const Point {aka const Point}' как 'this' аргумента 'ushort Point :: GetX ()' отбрасывает квалификаторы [-fpermissive]

Point.cpp: 8: 36: ошибка: передача 'const Point {aka const Point}' как 'this' аргумента 'ushort Point :: GetY ()' отбрасывает квалификаторы [-fpermissive]

    Point Point::operator+(const Point& pnt)
    {
        Point myPoint;
        myPoint.SetX(GetX() + pnt.GetX());    // Here I am trying to use accessor methods vs. member variables
        myPoint.SetY(GetY() + pnt.GetY());
        return myPoint;
    }

Последний код будет компилироваться, если ключевое слово 'const' будет удалено из списка параметров, что я не до конца понимаю, просто потому, что я передаю переменную const, почему это исключает мою возможность использовать метод доступа методы?

Ответы [ 2 ]

4 голосов
/ 10 февраля 2012

Изменение:

inline ushort GetX() { return m_nX; }
inline ushort GetY() { return m_nY; }

на:

inline ushort GetX() const { return m_nX; }
inline ushort GetY() const { return m_nY; }

Компилятор жалуется, что делается попытка вызвать метод non-const для объекта const.

4 голосов
/ 10 февраля 2012

Ваши функции получения не помечены как const, поэтому их нельзя вызывать для константного объекта:

inline ushort GetX() const { return m_nX; }
                     ^^^^^

Без ключевого слова const компилятор должен предположить, что функция может изменить объект, итаким образом, нельзя вызывать постоянный объект.Также полезно отметить, что в некоторых случаях вам может потребоваться версия как const, так и не const, с разными типами возврата, например:

const_iterator vector<T>::begin() const; //const version
iterator vector<T>::begin(); //mutable version

Использование методов получения и установки (на мой взгляд) правильнее, чем прямой доступ к членам правой стороны.

...