Могу ли я узнать, как использовать перегруженный конструктор для композиции объекта в другом классе, вот пример кода:
class A {
int a;
A( int inputA ) { a = inputA; }
};
class B {
A objectA;
B( A inputObjectA ) { objectA = inputObjectA; }
};
Ошибка с компилятором была в том, что нет конструктора по умолчанию A :: A ()?
Есть ли способ отредактировать код в параметре конструктора B, чтобы принять перегруженный конструктор в A?
Если у потомка нет конструктора по умолчанию, конструктор родителя должен передавать параметры.
class A {
public:
int a;
A( int inputA ) { a = inputA; }
};
class B {
A objectA;
public:
B( A inputObjectA ): objectA(inputObjectA.a) { }
};
В вашем случае было бы целесообразно использовать конструктор копирования для A, вместо того, чтобы делать его член общедоступным:
class A {
int a;
public:
A( int inputA ) { a = inputA; }
};
class B {
A objectA;
public:
B(A inputObjectA ): objectA(inputObjectA) { }
};
В вашем классе объекта B у вас есть
A objectA;
То есть, когда вызывается конструктор по умолчанию, поэтому вам нужно либо иметь назначенный конструктор по умолчанию, либо вы можете альтернативно использовать параметр по умолчанию, такой как
A( int inputA = 0 ) { a = inputA; }
Затем он возьмет на себя роль, которая устанавливает целое число a в 0, когда вы вызываете конструктор по умолчанию, он действительно достигнет того же
A() { a = 0; }
хоть
вам не нужно устанавливать a, если вы не хотите, но поскольку вы объявили конструктор не по умолчанию, он больше неявно создает его для вас. Так что вам понадобится как минимум
A(){ }
Еще один способ сделать это
class A {
int a;
void setSomething(int val) { a = val; }
};
class B {
A objectA;
B( A inputObjectA ) { objectA = inputObjectA; }
};
Это работает, потому что вы никогда не объявляли конструктор, поэтому он неявно создаст для вас конструктор по умолчанию.
И наконец, это еще один способ сделать это, возможно, ближе всего к исходному коду с добавлением всего 3 символов, и все должно исправить:
class A {
int a;
A( int inputA ) { a = inputA; }
};
class B {
A objectA(0);
B( A inputObjectA ) { objectA = inputObjectA; }
};
Просто пройдите A()
Параметры к конструктору B()
,
Это решение работает для A
который не является ни конструируемым по умолчанию, ни копируемым или перемещаемым конструируемым / назначаемым.
class A
{
int a;
// Just to demonstrate non copy-move-ness (can be removed)
A() = delete;
A( A& ) = delete;
A( A&& ) = delete;
A& operator=( A& ) = delete;
A& operator=( A&& ) = delete;
public:
A( int inputA ): a(inputA ) {}
};
class B
{
A objectA;
public:
B( int inputA ): objectA(inputA ) { }
};int main()
{
B(42);
}
Совет: не используйте присваивание в теле конструктора, вместо этого используйте списки инициализации конструктора.
Всю эту информацию вы можете получить от любая современная книга C ++.
Вам нужен конструктор по умолчанию, потому что у вас есть экземпляр класса A внутри класса B. Если вы немного прочтете о порядке вызова конструкторов, вы заметите, что сначала называются конструкторы по умолчанию для членов, а затем основной конструктор класса. Итак — в вашем примере — сначала компилятор пытается инициализировать objectA
со значением по умолчанию, и он терпит неудачу, потому что нет конструктора по умолчанию.