2013-08-21 3 views
0

Привет, я был простым классом кодирования, за которым следует образец кода в Интернете. Этот код отлично работает без ошибок.затеняет параметр, когда один параметр на конструкторе

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 объекта! Вместо этого он создает временный объект типа Shape с параметрами a и b. Версия один параметр делает что-то подобное:

Shape(a); 

определяет по умолчанию построен объект типа Shape называется a а. Вы, вероятно, имел в виду использовать список инициализации, чтобы передать аргументы конструктора в Shape подобъекте, например .:

reqSquare(int a = 0, int b = 0) 
    : Shape(a, b) { 
} 

или

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

верхний один точно такой же, как, например в Интернете. и он все еще не работает с добавлением «:» перед фигурой (a). любое предложение? – user842589

+0

@ user842589: Обратите внимание на точное размещение скобок: это изменение больше, чем добавление двоеточия перед 'Shape'! Вы должны указать базовые классы (и члены), которые вам нужно инициализировать в списке инициализаторов членов, который предшествует телу конструктора. Я могу воспроизвести вашу ошибку с исходным кодом, и мое изменение исправляет его. Если первый пример точно такой же, как и в Интернете, вы выбрали плохой источник для примера, поскольку он ведет себя так, как я сказал, и я уверен, что это не то, что вы хотите. –

Смежные вопросы