2013-11-11 2 views
0

Мой класс имеет следующие частные переменные, в том числе константный статический, как вы можете видеть:Как использовать конструктор копирования для копирования по постоянным переменным?

private: 
    // class constant for # of bits in an unsigned short int: 
    const static int _USI_BITS = sizeof(usi)*CHAR_BIT; 
    usi* _booArr; 
    int _booArrLen; 
    int _numBoos; 

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

BitPack::BitPack(const BitPack& other) { 
    _USI_BITS = other._USI_BITS; 
    _booArr = new usi[other._booArrLen]; 
    for (int i = 0; i < _booArrLen; ++i) 
     _booArr[i] = other._booArr[i]; 
    _booArrLen = other._booArrLen; 
    _numBoos = other.numBoos; 
} 

Компилятор говорит:

ошибка: назначение только для чтения переменной 'BitPack :: _ USI_BITS'

Пожалуйста разуверить меня из моих глупых способов.

+0

Является 'const' немного давание прочь. Это постоянно! –

+0

Все экземпляры 'BitPack' имеют один и тот же _static_ элемент данных' _USI_BITS'. Таким образом, вы уверены, что хотите скопировать его через экземпляры? – timrau

+0

'_USI_BITS' является' const', но вы пытаетесь его изменить. Возможно, это должно быть не 'static', а' const' в первую очередь, если оно полагается на экземпляры класса. – 0x499602D2

ответ

1

Конструкторы, включая конструкторы копирования, должны установить членов-членов, то есть те, которые не являются static. Статические члены разделяются всеми экземплярами и поэтому должны быть инициализированы вне любых конструкторов.

В вашем случае, вам нужно удалить строку

_USI_BITS = other._USI_BITS; 

: обе стороны относятся к одному static члена, так что присваивание не имеет никакого эффекта.

Остальная часть вашего конструктора копий в порядке. Обратите внимание, что, так как ваш конструктор копирования распределяет ресурсы, то rule of three предполагает, что вы должны добавить оператор пользовательского назначения, а также пользовательские деструктор:

BitPack& operator=(const BitPack& other) { 
    ... 
} 
~BitPack() { 
    ... 
} 
+0

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

+0

@ user2967799 Назначение похоже на конструктор копирования, за исключением того, что вы не можете предположить, что текущий объект пуст. В вашем конкретном случае это означает, что вы должны называть 'delete [] _booArr' перед назначением ему нового массива. Остальная часть кода будет идентична остальной части вашего конструктора копирования. – dasblinkenlight

Смежные вопросы