2013-10-11 57 views
1

我有在我的課gTexture兩個函數聲明:簡化重載類功能

public: 
           gTexture():mActiveTexture(0){...} 
    virtual void    DrawTexture(); 
    virtual void    DrawTexture(unsigned short int TextureNumber); 
      int     mActiveTexture; 

其中

void gTexture::DrawTexture() 
    { 
    gTexture::DrawTexture(mActiveTexture); 
    } 

我想有這樣一個功能類似

virtual void    DrawTexture(unsigned short int TextureNumber=mActiveTexture); 

這沒有編譯,因爲mActiveTexture是非靜態數據成員的無效使用。有沒有辦法只有一個函數,這將使我更容易處理派生的對象?謝謝。

+1

什麼是void foo():x(y){...}'? – juanchopanza

+0

@juanchopanza它是一個初始值設定項,只能在構造函數上完成 – wich

+0

@wich'DrawTexture'不是構造函數。 – juanchopanza

回答

1

我可以看到兩種方式。兩者都是解決方法 - 是的,但可能有用。

一個是使無參數函數非虛擬;它將總是用mActiveTexture來稱呼第二個。

另一種方法是使用領域的知識(尤其是事實,0是不是一個有效的OpenGL紋理名稱),這樣做:

virtual void DrawTexture(unsigned short int TextureNumber = 0) { 
    if (TextureNumber == 0) TextureNumber = mActiveTexture; 
    // ... rest of the code 
} 
+1

我認爲虛擬成員函數中的默認參數太可怕了。 – juanchopanza

+0

@juanchopanza事實上,至少可以說是有問題的,默認值是編譯時間,使用的取決於指針/引用的類型而不是實際對象的類型。 – wich

+0

ohh很好的幫助,謝謝。但是,第二個地方臨時工不起作用。 [0]指的是我的情況下紋理矢量的第一個元素。 – user2856452

0

你可以有一個默認的參數值無效(如-1)。然後你的函數可以檢查該值是否爲默認值,如果是,則使用mActiveTexture,否則將使用參數。

+0

這是一個好主意,但考慮到我使用數組和-1可能會導致程序崩潰。出於這個原因,我曾經在任何地方都擁有它,但是在我的整個項目中都偏離了-1 – user2856452

0

不,您不能將成員用作默認值。默認值在編譯時使用。

然而,您可以使用特殊值作爲默認值,如-1,然後檢查DrawTexture,如果輸入值爲-1,並且如果將它設置爲mActiveTexture。