Могу ли я инициализировать объект в списке инициализации другим членом класса?

0

Не нашли эту проблему на сайте. Поэтому скажите, что у меня есть два класса, один из которых содержит ссылку на другую:

class ClassA {};

class ClassB
{
    classA & r_classA;
    public:
        ClassB( ClassA & io_classA ):r_classA( io_classA ){}
};

Итак, если я хочу создать экземпляр класса B, я должен передать ему ссылку на classA в конструкторе:

int main()
{
    ClassA classA;
    ClassB classB ( classA );
    return 0;
}

Теперь скажем, что я создаю класс ClassC, который содержит эти два:

class ClassC
{
    ClassA m_classA;
    ClassB m_classB;
    public:
        ClassC();
}

Мой вопрос: могу ли я рассчитывать на создание m_classA до создания m_classB в списке инициализации? То есть, могу ли я сделать это:

ClassC::ClassC()
: m_classA()
, m_classB( m_classA )
{}

Соответствуют ли эти стандарты? Портативный? Нужно ли принимать какие-либо особые меры предосторожности? Я объявляю m_classA до m_classB в теле ClassC уже, и компилятор не выдавал никаких предупреждений. Программа, похоже, работает нормально. Я просто хочу проверить, что я не рассчитываю на какое-то ненадежное поведение, которое приведет к сбою или странным ошибкам.

Теги:
class
initialization
reference

1 ответ

4
Лучший ответ

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

(Хороший компилятор должен предупредить вас, если порядок списка инициализатора конструктора отличается от порядка объявления, поскольку это действительно тонкий источник ошибок, но ваш код делает это правильно.)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню