2012-08-14 41 views
1

我正在C++中製作一個三維矢量類(稱爲Vector3)。現在,我試圖重載流插入操作符(<<),以便我可以一次全部打印所有矢量的所有組件。我從MSD複製sintax,但我得到了3個錯誤。重載流插入操作符?

error: passing 'const Vector3 ' as 'this' argument of 'float Vector3::getX()' discards qualifiers [-fpermissive]
error: passing 'const Vector3 ' as 'this' argument of 'float Vector3::getY()' discards qualifiers [-fpermissive]
error: passing 'const Vector3 ' as 'this' argument of 'float Vector3::getZ()' discards qualifiers [-fpermissive]

(差別標記爲粗體)

在受到公衆Vector3.h,我進入了這個函數聲明:

friend ostream& operator<<(ostream &os, const Vector3 &vector); 

Vector3.cpp,我實現它:

ostream& operator<<(ostream& os, const Vector3& vector) 
{ 
    os << "(" << vector.getX() << ", " << vector.getY() << ", " << vector.getZ() << ")" << endl; 
    return os; 
} 

它肩膀根據x,y和z變量打印出類似(x, y, z)的內容。

在旁註中,vector.getX()行不應使用->而不是點,因爲矢量對象是地址指針嗎?

+2

是'的getX()''一個成員const'功能? – hmjd 2012-08-14 13:46:17

+1

如果你的'operator <<'只需要調用'Vector3'的公共成員函數就不需要成爲'friend'。 – Blastfurnace 2012-08-14 13:49:17

+0

至於你的旁註,不,它不應該 - vector參數不是一個指針(語法上),它是一個參考。引用變量與值變量具有相同的「點」語法。 – 2012-08-14 13:50:23

回答

6

const限定符添加到您的get...函數中。

class Vector3 
{ 
    public: 
     float getX() const {return x;}; 
}; 

一個const -qualified功能只是意味着你可以調用它的類的實例const。在這裏,獲得者不會改變任何事情。但是,如果您沒有指定,編譯器不知道,因此調用可能會改變const變量的某個函數是不允許的。

你可以閱讀關於const正確性here

和點符號是正確的,vector不是指針,但參考(即另一名其他一些Vector3&符號可以是一個有點混亂,對於初學者來說,我認爲大致有:。當你它應用到一個變量,它需要它的地址,當它是一個類型的一部分,這意味着該類型是一個參考。例如,參見herehere或。

+0

啊我明白了。做一個函數'const'究竟做了什麼?謹慎闡述? – 2012-08-14 13:48:56

+0

如果我需要在類的非'const'實例中調用'getX()'會怎麼樣? – 2012-08-14 13:52:16

+1

非const在這種情況下總是可以隱式強制轉換爲const,也就是說它可以正常工作 – 2012-08-14 13:54:27

1
float Vector3::getX() 

必須改變,以

float Vector3::getX() const 
2

我懷疑你還沒有將getX,getY和getZ函數聲明爲const。編譯器不會讓你使用它們,因爲它不能確定它們不會改變對象的狀態。

你應該能夠改變它們的聲明爲如下形式:

float Vector3::getX() const