で同じコードを繰り返さないようにしてください。クラスに動的に割り当てられたデータが含まれている場合は、コピーコンストラクタoperator =とdestructorを明示的に定義するのが一般的です。しかし、これらの特別な方法の活動は重なっている。より具体的にはoperator =通常は最初にいくつかの破壊を行い、コピーコンストラクタの場合と同様に対処します。コピーコンストラクタとoperator =
私の質問は、同じ行のコードを繰り返さずに、プロセッサが不要な作業(不要なコピーなど)をする必要なしに、これを最良の方法で書く方法です。
私は通常、2つの手助けの方法で終了します。 1つは建設用、もう1つは破壊用です。最初はコピーコンストラクタとoperator =の両方から呼び出されます。 2番目は、destructorとoperator =によって使用されます。ここで
はサンプルコードです:
template <class T>
class MyClass
{
private:
// Data members
int count;
T* data; // Some of them are dynamicly allocated
void construct(const MyClass& myClass)
{
// Code which does deep copy
this->count = myClass.count;
data = new T[count];
try
{
for (int i = 0; i < count; i++)
data[i] = myClass.data[i];
}
catch (...)
{
delete[] data;
throw;
}
}
void destruct()
{
// Dealocate all dynamicly allocated data members
delete[] data;
}
public: MyClass(int count) : count(count)
{
data = new T[count];
}
MyClass(const MyClass& myClass)
{
construct(myClass);
}
MyClass& operator = (const MyClass& myClass)
{
if (this != &myClass)
{
destruct();
construct(myClass);
}
return *this;
}
~MyClass()
{
destruct();
}
};
も、正しいこれですか? そして、この方法でコードを分割するのは良い習慣ですか?
+1という質問が私の意識を高めるのに役立ったからです。答えを読む前に、私が書いたようなものです。 – ToolmakerSteve
私はまったく異なるものを扱うので、両者でコードが重複することはほとんどありません。一つは初期化され、一つは.... – PlasmaHH
は重複につながる彼のクラスデザインの "ディープコピー"の性質です。 – ToolmakerSteve