2013-08-21 50 views
0

的陰影參數嗨我編碼簡單的類,然後在web中的示例代碼。 此代碼工作正常,沒有錯誤。當構造函數的單個參數

class Shape{ 
     protected: 
       int width,height; 

     public: 
      Shape(int a = 0, int b=0) 
      { 
      width = a; 
      height = b;   
         } 

}; 
class regSquare: public Shape{ 
     public: 
      regSquare(int a=0, int b=0) 
      { 
       Shape(a, b); 
      }  
}; 

但是當我改變我有隻有一個參數的構造函數,如

class Shape{ 
     protected: 
       int width; 
     public: 
      Shape(int a = 0) 
      { 
      width = a; 

         } 

}; 
class regSquare: public Shape{ 
     public: 
      regSquare(int a = 0) 
      { 
       Shape(a); 
      }  
}; 

它出現的錯誤與此按摩

'error: declaration of `a' shadows a parameter'

我不知道什麼是錯的我的代碼

回答

5

雖然這兩種版本都不會做你想要的東西!該代碼

regSquare(int a = 0, int b = 0) { 
    Shape(a, b); 
} 

是否初始化Shape子對象的regSquare對象!相反,它會使用參數ab創建類型爲Shape的臨時對象。在一個參數的版本有類似的功能:

Shape(a); 

定義了一個名爲aShape類型的默認構造的對象。你可能想用的初始化列表構造函數的參數傳遞到子對象Shape,例如: -

​​

regSquare(int a = 0) 
    : Shape(a) { 
} 
+0

上一個是完全一樣的例子在網絡上。並且它仍然不能在Shape(a)前添加「:」。任何建議? – user842589

+0

@ user842589:注意圓括號的確切位置:更改不僅僅是在「Shape」前面添加冒號!您需要提到需要在構造函數體的前面的成員初始值設定項列表中初始化的基類(和成員)。我可以用原始代碼重現你的錯誤,我的改變確實修復了它。如果第一個示例與Web完全相同,則您選擇一個示例的不良來源,因爲它的行爲如我所述,並且我非常確定這不是您想要的。 –