Я хочу инициализировать массив класса «часть» в списке инициализаторов членов составленного/целого класса

#c #class #operator-overloading #composition #initializer-list

Вопрос:

Пожалуйста, помогите мне в этом. Я хочу инициализировать массив класса «часть» в списке инициализаторов членов составленного/целого класса. Здесь класс B состоит из класса A. Теперь в конструкторе класса B я буду инициализировать массив в списке инициализаторов элементов. Я знаю, как инициализировать один объект класса «часть» в конструкторе всего класса, но как массив класса части может быть инициализирован в конструкторе всего класса. Кроме того, если я не инициализирую массив класса деталей в списке инициализаторов элементов, будет ли код работать? Заранее спасибо.

 #include <iostream>
using namespace std ;

class A  //part class
{
  public:
    A( int value = 0)
    { a = value ; }
    
    void printA()
    {
        cout << "nPrinting A members : " << a << endl ;
    }
 
    void setA( int value)
    { a = value ; }

    protected:
      int a ;

 };


 class B  //whole class
 {
   public:
     B( int value = 5 ) : aM(0) //member initializer list
     { b = value ; }
  
     void printB()
     {
       cout << "nPrinting B members : " << b << endl ;
       aM.printA() ;
       for (int i = 0 ; i < 5 ; i  )
         cout << arr[i] << " , " ;
     }

   private:
     int b ;
     A aM ; //composition
     A arr[5] ;

};


int main()
{
  B objB ;
  objB.printB() ;


  return 0 ;
}
 

Ответ №1:

Вы инициализируете массив элемента почти так же, как инициализируете массив в противном случае, используя заключенный в фигурные скобки список элементов. Или ничего, если вы хотите, чтобы все элементы были построены по умолчанию:

 B( int value = 5 ) : b{ value }, aM{ }, arr{ }
{ }
 

На другой ноте,

 cout << arr[i] << " , " ;
 

недопустимо, так как у вас нет перегруженного << оператора для A . Возможно, вы хотите этого вместо этого:

 arr[i].printA();
 

Ответ №2:

Если я правильно понял, вам нужно следующее

 B( int value = 5 ) : b( value ), aM(0), arr{}
{
}
 

Однако достаточно написать

 B( int value = 5 ) : b( value )
{
}
 

потому что конструктор класса A по умолчанию инициализирует элементы данных aM и arr нулями.

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

 B( int value = 5 ) : b( value ), aM(0), arr{ 1, 2, 3, 4, 5}
{
}
 

И функция-член

  void printB()
 {
   cout << "nPrinting B members : " << b << endl ;
   aM.printA() ;
   for (int i = 0 ; i < 5 ; i  )
     cout << arr[i] << " , " ;
 }
 

неверно, потому что нет определенного оператора <

Чтобы сделать это утверждение действительным

      cout << arr[i] << " , " ;
 

определите оператор <

 class A  //part class
{
  public:
    A( int value = 0)
    { a = value ; }
    
    void printA()
    {
        cout << "nPrinting A members : " << a << endl ;
    }
 
    void setA( int value)
    { a = value ; }

    friend std::ostream amp; operator <<( std::ostream amp;os, const A amp;a )
    {
        return os << a.a;
    }
    protected:
      int a ;

 };