Синтаксис разыменования в конструкторе копирования для класса, который содержит другие объекты

#c #pass-by-reference #composition #copy-constructor

#c #передача по ссылке #композиция #copy-constructor

Вопрос:

Предположим, что класс MyClass имеет конструктор:

 MyClass::MyClass( ... ) {
    var = new OtherClass( ... );
}
  

и предположим, что класс OtherClass имеет конструктор копирования:

 OtherClass::OtherClass(const OtherClass amp;obj) {
    for (int i = 0; i < array_size;   i) {
        array[i] = obj.array[i];
    }
}
  

Является ли приведенный ниже рекомендуемый способ написания конструктора копирования для MyClass?

 MyClass::MyClass(const MyClass amp;obj) {
    var = new OtherClass(*obj.var);
}
  

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

Редактировать: Извините, я оставил опечатку в конструкторе копирования (введенную, когда я пытался сделать пример кода абстрактным): *obj.array так и должно было быть *obj.var .

Комментарии:

1. какой тип MyClass::array ?

Ответ №1:

Нет, это действительно не имеет смысла. Что имеет смысл, так это:

 MyClass::MyClass(const MyClass amp;obj) {
    var = new OtherClass(*obj.var);
}
  

Или, скорее:

 MyClass::MyClass(const MyClass amp;obj)
    :var(new OtherClass(*obj.var))
{}
  

Комментарии:

1. Прошу прощения за опечатку. В первой части вашего предложения используется синтаксис, который я намеревался использовать, но я не рассматривал возможность использования списка инициализации элемента. Спасибо!

Ответ №2:

Предполагая, что это var на самом деле является членом MyClass и указателем на OtherClass , я бы написал

 MyClass::MyClass(const MyClass amp;obj) : var(new OtherClass(obj.array))
{
   ...
}
  

Ответ №3:

Да, обычно рекомендуется, чтобы ctors копирования принимали const ссылочные параметры.

Вам не нужно разыменовывать ссылку. Измените свой код на:

 MyClass::MyClass(const MyClass amp;obj) {
    var = new OtherClass(obj.array);
}
  

Комментарии:

1. -1: Не используется конструктор копирования другого класса (var, а не array)

2. @Martin: ctor copt, на который я ссылался, является MyClass ‘s

3. Так почему бы не использовать конструктор копирования другого класса?

4. Извините за опечатку ( obj.array а не obj.var ) — которая, к сожалению, скопирована в приведенном выше ответе. Поскольку obj.var это указатель, а OtherClass конструктор копирования ожидает объект (на который он создает постоянную ссылку), я полагаю, что я должен разыменовать obj.var .