私はC++を自分自身で試していますが、少し混乱しています。
私は実際にコンストラクタ/コピーコンストラクタ/コンストラクタ/デストラクタを理解し、それらを正しく設定することに問題がありました。C++ - コンストラクタ、コピーコンストラクタ、移動コンストラクタ、デストラクタ
class Container
にコピーと移動コンストラクタとデストラクタを実装したいと思います。私はコピーコンストラクタを最初に試して、それが正しいと思った。残念なことに、デストラクタでは、delete[] data
を実行しようとすると何らかの理由でプログラムがクラッシュすることがあります。 フィールドdata
はもう存在しないと私は間違っていたと思う。あなたが私を助けて間違いを理解することができれば幸いです。 私は絶対に動作しない移動コンストラクタ(下)も試しました。
助けを借りてくれてありがとう。
#include <iostream>
#include <memory>
class Container
{
public:
Container()
{
length = 0;
data = nullptr;
}
Container(int lengthin):Container()
{
length = lengthin;
data = new double[lengthin];
//data[lengthin];
//double data[lengthin] = {0};
}
Container(std::initializer_list<double> listin)
:Container((int)listin.size())
{
std::uninitialized_copy (listin.begin(), listin.end(), data);
}
//copy constructor - working?
Container(const Container& other):Container(other.length)
{
//data = other.data;
//length = other.length;
for (auto i=0; i<other.length; i++)
{
data[i] = other.data[i];
}
}
//~Container(){length = 0;}
~Container()
{
delete[] data;
length = 0;
}
Container operator+(Container cin)
{
Container cout(cin.length);
cout.length = cin.length;
for (auto i=0; i<cin.length; i++)
{
cout.data[i] = cin.data[i] + data[i];
}
return cout;
}
Container operator-(Container cin)
{
Container cout(cin.length);
cout.length = cin.length;
for (auto i=0; i<cin.length; i++)
{
cout.data[i] = data[i]-cin.data[i];
}
return cout;
}
void print(const std::string &info) const
{
// print the address of this instance, the attributes `length` and
// `data` and the `info` string
std::cout << " " << this << " " << length << " " << data << " "
<< info << std::endl;
}
private:
int length;
double *data;
};
メインプログラム:
int main()
{
Container a({ 1, 2, 3 });
std::cout << " a has address " << &a << std::endl;
Container b = { 4, 5, 6 };
std::cout << " b has address " << &b << std::endl;
Container c(a);
std::cout << " c has address " << &c << std::endl;
Container d = a + b;
std::cout << " d has address " << &d << std::endl;
Container e;
std::cout << " e has address " << &e << std::endl;
e = a + b;
//Container f(std::move(a + b));
//std::cout << " f has address " << &f << std::endl;
return 0;}
としようとした移動のコンストラクタ:
Container(const Container&& other):length(other.length), data(other.data)