конструкция объекта [c ++] - PullRequest
       3

конструкция объекта [c ++]

0 голосов
/ 11 августа 2011

У меня есть этот класс:

class A {
    B b;
    // snip.
}

Это будет работать нормально, если у B есть конструктор, который не принимает аргументов, или конструктор по умолчанию.построенный как B (x), как код должен быть изменен.Одним из очевидных способов является использование new / delete и B *, но мне интересно, возможно ли это без использования динамической памяти?

Ответы [ 4 ]

6 голосов
/ 11 августа 2011

Используйте member-initialization-list , чтобы инициализировать переменные-члены следующим образом:

class A {
    B b;
    C c;
public:

    A() : b(10){}   //if B's constructor takes int, for example!

    //Or
    A(T x) : b(x), c(x) {} 
         //^^^^^^^^^^^^ this is called member-initialization-list
}
2 голосов
/ 11 августа 2011

Две возможности:

Либо использовать список инициализации в конструкторе А

A::A(int x):b(x)
{

}

Или, если вы не можете создать b непосредственно в конструкторе А, вам нужен указатель

class A
{
  B * b;
}
2 голосов
/ 11 августа 2011

new / delete не поможет.Вам или нужен конструктор для A ...

A::A(X x) : b(x) { }

... или используйте инициализацию структуры ...

A a = { B(x) };
0 голосов
/ 11 августа 2011

Один очевидный способ - использовать new / delete и B *, но мне интересно это возможно без использования динамической памяти?

Обычно вы либо используете указатель, либо добавляете один конструктор в класс B, чтобы он мог передать аргумент для инициализации объекта A, как уже упоминалось во многих ответах.

Но в некоторых особых случаях вы могли бы уйти без добавления конструктора в класс B и без указателя, но с помощью инициализации значения , когда класс B не определяет конструктор:

struct B{
int i;
};

struct A{
    B b;
};

int main()
{
    A a ={1}; //here i being initialized to 1
} 

Обратите внимание, что я не рекомендую эту инициализацию значения, просто чтобы вы знали, что объект может быть инициализирован таким образом.

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