2015-01-20 2 views
-2

Мой вопрос является основным. Поскольку std::string s являются массивами, я правильно обрабатываю их в своем конструкторе копирования?copy constructor - я правильно устанавливаю свои std :: строки

class json{ 
    private: 
     std::string _objectContents; 
     std::string _regComments; 

     bool _isJson; 
     int numElements; 

    public: 
     json(const json&); 

     ... 
}; 

json::json(const json& source){ 
    _objectContents = source._objectContents; 
    _regComments = source._regComments; 
    _isJson = source._isJson; 
    _numElements = source.numElements; 
} 

* отредактирован удалить указатель и изменен на соответствующий массив.

+7

«Так как' std :: strings' являются указателями »Что? – Columbo

+2

1) Строки не указатели. 2) Конструкторы копирования генерируются компилятором, вам почти никогда не приходится писать их самостоятельно. – rightfold

+4

По умолчанию реализация конструктора копирования должна быть в порядке, вам не нужно писать самостоятельно. – Borgleader

ответ

3

я я установка мой зЬй :: строк правильно

Вы устанавливаете их правильно, но это может быть лучше.

  1. Вам не нужен явно определенный конструктор копирования. Тот, который сгенерирован компилятором, сделает правильные действия для ваших переменных-членов.

  2. Если вы должны явно определить конструктор копирования, инициализируйте элементы, используя список инициализации. Изменение реализации на:

    json::json(const json& source) : 
        _objectContents(source._objectContents), 
        _regComments(source._regComments), 
        _isJson(source._isJson), 
        _numElements(source.numElements) 
    { 
    } 
    
+0

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

2

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