2012-02-09 54 views
0

所以我總是被教導,好的編碼習慣是使用訪問器方法而不是直接訪問成員變量,但是在編寫重載操作符時,如果在操作符類定義中使用這些訪問器方法,我將無法編譯。因此,假設下面的類:您可以在重載操作符中使用訪問器方法嗎?

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: error: passing 'const Point {aka const Point}' as 'this' argument of 'ushort Point::GetX()' discards qualifiers [-fpermissive]

Point.cpp:8:36: error: passing 'const Point {aka const Point}' as 'this' argument of 'ushort Point::GetY()' discards qualifiers [-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變量,爲什麼這會消除我使用訪問器方法的能力?

+1

您的成員'operator +'也應該是'const'限定的。你沒有修改這個論點。 – pmr 2012-02-09 20:59:18

回答

4

你的getter函數沒有標記爲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 

使用getter和setter方法是(在我看來)更正確而不是直接訪問右側的成員。

+2

+1。我認爲關鍵的一點是C++不知道*,除非你告訴它,這些只是getter,並且把它們稱爲'const'對象是安全的。 (這是一件好事,它意味着你不會意外地編寫調用'const'對象的方法的代碼,除非你打算讓方法成爲'const'安全的,而不是,只是說它只是暫時'const'安全,因爲現在它只是一個空的存根。) – ruakh 2012-02-09 20:58:37

4

變化:

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; } 

編譯器抱怨並嘗試正在取得調用const對象上的non-const方法。

相關問題