2012-02-15 188 views
19

我想爲其中一個成員函數可選參數。當沒有提供參數時,它將使用成員變量。如何在C++中使用成員變量作爲默認參數?

然而,當我試圖編譯它,它顯示「錯誤:無效使用非靜態數據成員的對象:: initPos「的」

只是爲了隔離問題,我試着違約int類型它編譯得很好。 我想知道我的代碼有什麼問題,以及如何使用成員函數作爲默認值。

謝謝你的幫助!

Object.h

class Object 
{ 
    public: 
     ... 
     void MoveTo(double speed, Point position); 

    protected: 
     Point initPos; 
     Point currPos; 

}; 

Object.c

void Object::MoveTo(double speed, Point position = initPos) 
{ 
    currPos = postion; 
} 

Point.h

class Point 
{ 
    ... 

    private: 
     double x; 
     double y; 
     double z; 
}; 
+1

你的問題讓我這個產卵一個:http://stackoverflow.com/questions/9286801/valid-expressions-for-default-function-arguments – 2012-02-15 01:42:56

回答

30

成員函數的默認參數表達式只能依賴於類或全局作用域中的東西。缺省參數也必須在方法聲明中指定(即在頭文件中)。

爲了解決這個問題,需要2個重載的MoveTo方法。一個需要1個參數,另一個需要2個參數。採用1個參數的方法調用另一個方法,傳遞您認爲是默認值的值。

void Object::MoveTo(double speed) 
{ 
    MoveTo(speed, initPos); 
} 

void Object::MoveTo(double speed, Point position) 
{ 
    // Everything is done here. 
} 

注意,當你MoveTo(double)電話MoveTo(double, Point),它可以讓你寫的MoveTo實施只有一次,從而尊重DRY原則。

+0

謝謝!我知道我可以這樣做。我只是想知道是否有一個更短的方法來做到這一點,比如將其作爲默認參數。但我想這將是唯一的方法來做到這一點。 – tuzzer 2012-02-15 01:14:26

+0

那麼,如果,而不是隻有一個可選參數,我有很多呢? 說 void Object :: MoveTo(double speed,Point position = initPos,Point a = m_a,Point b = m_b,Point c = m_c) 那麼我不需要做許多函數? – tuzzer 2012-02-15 01:17:05

+0

@MatthewChan:不幸的是,是的。不要傳遞許多參數,也許可以更改設計,以便用戶傳遞一個對象。這個對象已經包含了合理的默認值,用戶只能改變那些需要不同的值。如果你決定這樣做,你可能會對Method Chaining idiom感興趣,使設置多個參數更簡潔(http://en.wikipedia.org/wiki/Method_chaining)。 – 2012-02-15 01:27:16

10

默認值是不是該原型的部分,即他們被解決調用者,而不是由函數本身。所以首先,他們必須對呼叫者可見。其次,他們無法訪問班級的受保護成員。 (我很確定你甚至不能使用公共成員作爲默認值,但我太累了無法檢查。)

要解決此問題,請按照其他答案中的建議使用鏈式重載。

+0

謝謝。我嘗試將initPos更改爲public,但正如您所說,它仍然無法正常工作。 因此,我們只能使用常量作爲默認參數(如不是成員函數,可以輸出的東西)? – tuzzer 2012-02-15 01:10:55

1

可以重載你的函數成員那樣:

void Object::MoveTo(double speed, Point position) { 
    .... 
} 

void Object::MoveTo(double speed) { 
    Point position = this->initPos; 

    MoveTo(speed, position); 
} 
+0

不幸的是唯一的工作可以完成工作,看起來很醜,但:( – Argento 2017-12-08 22:30:01

相關問題