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