с ++ как написать конструктор? - PullRequest
2 голосов
/ 01 апреля 2011

Я не привык к c ++, и у меня проблема с написанием конструктора.
Посмотрите этот пример, это короткая версия кода, над которым я работаю:

class B {
public:
  B(int x);
}

class A {
public:
  B b;
  A(){
    // here I have to initialize b
  }
}

Это приводит к ошибке компилятора, поскольку мне нужно инициализировать b в конструкторе A, поскольку B не имеет конструктора по умолчанию.

Я думаю, что я сделал это в списке инициализации, но аргумент B (int x) - это значение, которое я должен вычислить с помощью некоторого алгоритма, поэтому я не знаю, как это должно быть сделано правильно, или если я ' Я что-то упускаю или делаю неправильно.

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

Каким будет правильный способ инициализации b в этом случае?

Спасибо!

Ответы [ 3 ]

11 голосов
/ 01 апреля 2011

Вы можете вызывать функции в вашем списке инициализатора конструктора.

class B {
public:
  B(int x);
}; // note semicolon

class A {
public:
  B b;

  A()
  :b(calculateValue()) {
    // here I have to initialize b
  }

  static int calculateValue() {
    /* ... */
  }
}; // note semicolon

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

1 голос
/ 01 апреля 2011

Вы используете список инициализатора, что-то вроде этого:

A() : b(f(x)) {}
0 голосов
/ 01 апреля 2011
#include<iostream>

class B {
    public:
        B(){} // A default constructor is a must, if you have other variations of constructor
        B(int x){}
}; // class body ends with a semicolon

class A {
    private:
        B b;
    public:
        A(){
            // here I have to initialize b
        }
        void write(){
            std::cout<<"Awesome";
        }
};

int main(){
    A a;
    a.write();
}

В C ++, если у вас есть конструктор, который принимает аргумент, конструктор по умолчанию является обязательным, в отличие от других языков, таких как Java.Это все, что вам нужно изменить.Благодаря.

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