Порядок вызова конструкции (C ++) - PullRequest
2 голосов
/ 21 февраля 2012

У меня есть два подкласса, наследующих один и тот же абстрактный суперкласс. Существует общая операция для всех подклассов, которая зависит от нескольких атрибутов. Позвольте мне объяснить на примере:

Скажите, что это суперкласс A (A является абстрактным):

class superClass
{
  int valueA;
  int valueB;
  float* array;

   public superClass(){
      array[valueA + valueB]
   }

   virtual foo(){
   }

}

А это мои подклассы:

class firstSubClass: superClass
{

   public firstSubClass():superClass(), valueA(100),valueB(2){
   }

   foo(){
   }

}

class secondSubClass: superClass
{

   public secondSubClass():superClass(), valueA(50),valueB(3){
   }

   foo(){
   }

}

Будет ли массив правильно инициализирован? Что означает, вызывается ли конструктор подкласса перед суперклассом, или наоборот?

Есть ли способ сделать поведение инициализации общим для обоих подклассов, поместив его в суперкласс?

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 21 февраля 2012

Сначала вызывается конструктор superClass.

Конструктор superClass должен отвечать за инициализацию элементов данных superClass's, а firstSubClass должен инициализировать свои собственные элементы данных и вызывать superClass'sconstructor;

Дополнительная информация о порядке вызова конструктора здесь , и вы также можете прочитать о списках инициализатора конструктора здесь

Итак, я бы хотелопределить superClass, firstSubClass и secondSubClass как:

class superClass
{
  int valueA;
  int valueB;
  float* array;

  public:

   superClass( int a , int b ): valueA(a),valueB(b) {

      array = new float[valueA + valueB];
   }
   virtual foo(){
   }

}



class firstSubClass: public superClass
{

   public:

   firstSubClass():superClass(100,2){ //calls superclass's constructor
   }

   foo(){
   }

}

class secondSubClass: public superClass
{

   public :

   secondSubClass():superClass(50 , 3){
   }

   foo(){
   }

}
1 голос
/ 21 февраля 2012

Если я правильно понял, вы хотите, чтобы суперкласс создавал (а не просто инициализировал) массив с плавающей точкой при создании любого из подклассов.При создании экземпляра унаследованного класса сначала вызывается конструктор базового класса, и вам нужно передать ему значения valueA и valueB - вам необходимо добавить их в качестве аргументов конструктора:

superClass::superClass(int valueA, int valueB) : 
   valueA(valueA), valueB(valueB), array(0)
{
   // now create an array of requested length - allocate memory for it
   array = new float[valueA + valueB];
}

// don't forget to deallocate memory for it (possibly in destructor)
superClass::~superClass()
{
   delete[] array;
   array = 0;
}

Затем при создании экземпляровнаследуемого класса, вы можете предоставить значения A и valueB в качестве параметров конструктора суперкласса:

firstSubClass::firstSubClass() : superClass(100, 2)
{
   //...
}

Не рекомендуется использовать жестко закодированные значения (магические числа), поэтому было бы лучше добавить valueA и valueB в качестве подклассааргументы конструктора:

firstSubClass::firstSubClass(int valueA, int valueB) : superClass(valueA, valueB)
{
   //...
}

Наконец, вам следует избегать массивов.Это C ++, используйте std::vector<float>, это намного безопаснее и проще в использовании!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...