Разыменование синтаксиса в конструкторе копирования для класса, который содержит другие объекты - PullRequest
0 голосов
/ 14 апреля 2011

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

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

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

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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 14 апреля 2011

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

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

Вернее:

MyClass::MyClass(const MyClass &obj)
    :var(new OtherClass(*obj.var))
{}
1 голос
/ 14 апреля 2011

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

MyClass::MyClass(const MyClass &obj) : var(new OtherClass(obj.array))
{
   ...
}
0 голосов
/ 14 апреля 2011

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

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

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