ディープコピーを実行するために代入演算子のオーバーロードを使用しようとしていますが、正しい方法を見つけることができません。私はクラスコンピュータを持っていて、そのオブジェクトをクラスラップトップのものにコピーするためにそれを使用する必要があります。C++で代入演算子のオーバーロードを実装する方法は?
答えて
それは次のようになります。
非ポインタメンバ変数については#include <algorithm>
class SomeClass {};
class AnotherClass {};
class Computer
{
public:
Computer() :
m_someclass(new SomeClass()),
m_double(0.0)
{
}
virtual ~Computer()
{
delete m_someclass;
}
Computer(const Computer& other) :
m_someclass(new SomeClass(*other.m_someclass)),
m_double(other.m_double)
{
}
Computer& operator=(const Computer& other)
{
if (this != &other)
{
Computer tmp(other);
swap(tmp);
}
return *this;
}
void swap(Computer& other) noexcept // or throw() for before c++11
{
std::swap(m_someclass, other.m_someclass);
std::swap(m_double, other.m_double);
}
private:
SomeClass* m_someclass;
double m_double;
};
class Laptop : public Computer
{
public:
Laptop() :
m_anotherclass(new AnotherClass()),
m_int(0)
{
}
virtual ~Laptop()
{
delete m_anotherclass;
}
Laptop(const Laptop& other) :
Computer(other),
m_anotherclass(new AnotherClass(*other.m_anotherclass)),
m_int(other.m_int)
{
}
// Create a Laptop object from a Computer object
explicit Laptop(const Computer& other) :
Computer(other),
m_anotherclass(new AnotherClass()),
m_int(0)
{
}
Laptop& operator=(const Laptop& other)
{
if (this != &other)
{
Laptop tmp(other);
swap(tmp);
}
return *this;
}
// Assign a laptop object from a computer object.
Laptop& operator=(const Computer& other)
{
if (this != &other)
{
Laptop tmp(other);
swap(tmp);
}
return *this;
}
void swap(Laptop& other) noexcept // or throw() for before c++11
{
Computer::swap(other);
std::swap(m_anotherclass, other.m_anotherclass);
std::swap(m_int, other.m_int);
}
private:
AnotherClass* m_anotherclass;
int m_int;
};
int main()
{
Computer computer;
// Construct a new Laptop object by copying data from a Computer object
Laptop laptop1(computer);
// Assign Computer data in Laptop to that of a Computer object
Laptop laptop2;
laptop2 = computer;
}
は、あなただけの作業で、標準コピーを実行します=。オブジェクトが所有するポインタメンバ変数の場合は、new演算子を使用して、他のオブジェクトが持つポインタで構築します。
通常、新しいリソースを設定する前に古いリソースを解放する必要があります。したがって、 'if(m_someclass && m_someclass!= other.m_someclass)delete m_someclass;をチェックして、m_someclassを上書きする必要があります。 other.m_someclass!= nullptrの場合にのみコピーコンストラクタも呼び出します。 –
ああ、非常に良い点。ただし、nullポインタを削除しても安全だから、削除する前に 'if(m_someclass)'をチェックする必要はありません。また、各オブジェクトがそのm_someclassを「所有している」場合、2つの異なるオブジェクトが同じm_someclassを持つとは思わない。しかし、私はとにかくそこに小切手を入れました。例外安全のために一時的なポインタに 'new SomeClass'を使用しました。新しいスローの場合、m_someclassは同じままです。どう考えているか教えてください。 –
オーナーシップが明白な場合は、右と右をもう一度押します。まだ例外的に安全ではありません。一般的には、コードを分割して最初から分割し、スローしない2番目の部分にメンバー変数を設定する必要があります。これで、m_double siは上書きされますが、m_someclassは上書きされないという状況になります。それを下に移動するか、temp varを使用することができます。 "3のルール"に従うようにクラスを修正することもできます –
- 1. C++のオーバーロード代入演算子
- 2. C++ BigIntegerと代入演算子オーバーロード
- 3. リンクリストクラスで代入演算子を実装する方法
- 4. 演算子のオーバーロードでchar *にintを代入する方法
- 5. 代入演算子のオーバーロードのアプリケーション例
- 6. C++の演算子[]の演算子オーバーロードを書く方法
- 7. プロキシクラス - 代入演算子の実装方法
- 8. C++オーバーロード:[] []演算子のオーバーロード
- 9. オーバーロードされたコピー代入演算子からC++のデフォルトのコピー代入演算子を呼び出す
- 10. C++ - 代入演算子をオーバーロードできません
- 11. C++:コピーコンストラクタとコピー代入演算子の実装
- 12. 演算子のオーバーロードを実装する最善の方法は何ですか?
- 13. C++演算子+演算子+ =オーバーロード
- 14. C++:演算子オーバーロード、演算子+
- 15. C++オーバーロード演算子++
- 16. C:++で演算子のオーバーロード「:=」
- 17. C++ライブラリのクラスのオーバーロード代入演算子
- 18. デストラクタ呼び出しの後にオーバーロード代入演算子 - C++
- 19. ブールと代入演算子(C++)の文字列オーバーロード
- 20. 代入とプラス演算子のオーバーロード代入
- 21. C++の代入演算子または増分演算子
- 22. 代入演算子のオーバーロードのC#の不足を回避するには
- 23. C++の演算子のオーバーロード
- 24. C++のオーバーロード()、[]演算子
- 25. C++演算子のオーバーロード[]
- 26. 演算子のオーバーロード+ C++
- 27. 演算子のオーバーロード== C++
- 28. C#のオーバーロード演算子==クラス
- 29. C++マップの演算子オーバーロード
- 30. C++演算子のオーバーロード順
正確に何をしたいのかのコードサンプルは高く評価されます。 –