#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 ;
};