Как я могу инициализировать ссылку на константу члена в производном классе, когда я хочу вызвать конструктор базового класса?

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

Допустим, у меня есть базовый класс A с конструктором, который принимает параметр int. В моем производном классе B я хочу вызвать этот конструктор, но также инициализировать ссылку на член, переданную в конструкторе B. Как я могу это сделать? Я не могу найти синтаксис для добавления списка инициализации, если я вызываю конструктор базового класса. Это возможно?

Допустим, у меня есть:

Class Object
{
   Object(){}
}

Class A
{
   A(int number) : m_number(number){}

public:
   int m_number;
}

Теперь, как мне инициализировать m_obj, если я хочу вызвать конструктор A не по умолчанию?

e.g.

Class B : Class A
{
   B(int number, const Object& objRef) : A(number)
   {
       m_obj = objRef; //error, : must be initialized in constructor base/member  
                       // initializer list...but I cannot access an initializer list!!
   }

private: 
   const Object& m_obj;
}

как я уже сказал, мои намерения, вероятно, здесь неверны, но если они верны, я не могу найти примеры синтаксиса в Google.

полегче со мной...:)


person killeagle    schedule 02.02.2013    source источник
comment
Также обратите внимание, что вы не можете отказаться от константности ссылки, поэтому вам придется либо изменить член m_obj на const Object&, либо изменить свой конструктор, чтобы он принимал Object& вместо const Object&   -  person LihO    schedule 02.02.2013
comment
@LihO, допустим, я хочу передать неконстантную ссылку на функцию-член этого класса, но я не хочу, чтобы функция изменяла объект, на который ссылаются? Рекомендуется, чтобы параметры функции передавались как константная ссылка, но означает ли это, что объекты, на которые ссылаются, также должны быть константными?   -  person killeagle    schedule 02.02.2013
comment
Дело в том, что если вы передаете ссылку const, вы должны сохранить ее как ссылку const. private: Object& m_obj; должно быть private: const Object& m_obj;.   -  person LihO    schedule 02.02.2013
comment
обновленная ссылка на const   -  person killeagle    schedule 02.02.2013


Ответы (1)


В списке инициализации конструктора:

B(int number, const Object& objRef) : A(number), m_obj(objRef)
{}

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

person Oliver Charlesworth    schedule 02.02.2013
comment
Спасибо за это, это сводило меня с ума, пытаясь найти этот синтаксис (то есть запятую после ctor базового класса). - person killeagle; 02.02.2013