次のコードを見て、将来問題が発生するかどうか、発生する場合は回避する方法を教えてください。
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!
}
...
};
つまり、コピーコンストラクターで、(データベース)IDフィールドを含むオブジェクトの正確なコピーを作成する必要があります。一方、割り当てるときは、データフィールドをコピーするだけです。しかし、通常、copyctorとoperator=のセマンティクスは同じであるため、いくつかの懸念があります。
idフィールドは、Noteとその友人によってのみ使用されます。他のすべてのクライアントの場合、代入演算子は正確なコピーを作成します。ユースケース:メモを編集する場合は、copy ctorを使用してコピーを作成し、編集してから、メモを管理するNotebookクラスでsaveを呼び出します。
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);
このアプローチはもっともらしいですか?そうでない場合は、考えられる悪影響を指摘してください。どうもありがとう!