Пожалуйста, посмотрите на следующий код и скажите мне, не вызовет ли он проблем в будущем, и если да, то как их избежать.
class Note
{
int id;
std::string text;
public:
// ... some ctors here...
Note(const Note& other) : id(other.id), text(other.text) {}
void operator=(const Note& other) // returns void: no chaining wanted
{
if (&other == this) return;
text = other.text;
// NB: id stays the same!
}
...
};
Короче говоря, я хочу, чтобы конструктор копирования создавал точную копию объекта, включая его поле идентификатора (базы данных). С другой стороны, когда я назначаю, я хочу просто скопировать поля данных.
Но у меня есть некоторые опасения, поскольку обычно копия ctor и оператор = имеют одинаковую семантику.
Поле id используется только Note и его друзьями. Для всех остальных клиентов оператор присваивания создает точную копию. Вариант использования: Когда я хочу отредактировать заметку, я создаю копию, используя копию ctor, редактирую ее и затем вызываю save в классе Notebook, который управляет Notes:
Note n(notebook.getNote(id));
n = editNote(n); // pass by const ref (for the case edit is canceled)
notebook.saveNote(n);
Когда, с другой стороны, я хочу создать совершенно новую заметку с тем же содержанием, что и существующая заметка, я могу сделать это:
Note n;
n = notebook.getNote(id);
n.setText("This is a copy");
notebook.addNote(n);
Является ли этот подход правдоподобным? Если нет, пожалуйста, укажите возможные негативные последствия! Большое спасибо!