C++11 显式调用ctor以分配内存
考虑以下类别:C++11 显式调用ctor以分配内存,c++11,C++11,考虑以下类别: class Vector{ int dim; //dimension of array v Complex* v; //Complex is another class public: Vector(int dim = 0):dim(dim){(dim)?(v=new Complex[dim]):(v=nullptr);} Vector(int dim, const Complex* c):dim(dim),v(new Complex[dim])
class Vector{
int dim; //dimension of array v
Complex* v; //Complex is another class
public:
Vector(int dim = 0):dim(dim){(dim)?(v=new Complex[dim]):(v=nullptr);}
Vector(int dim, const Complex* c):dim(dim),v(new Complex[dim]){
for(int i=0;i<dim;i++) v[i]=c[i];}
Vector(const Vector& a):dim(a.dim),v(new Complex[a.dim]){
for(int i=0;i<dim;i++) v[i]=a.v[i];}
~Vector(){if(dim)delete [] v,v=nullptr;}
friend Vector& operator >> (Vector& is,Complex& z){
Vector copie(is);
is.~Vector();
is.Vector::Vector(is.dim+1);}
};
不允许我使用容器!!
请帮帮我 没错,您不能直接调用构造函数。可能您想使用新的布局
friend Vector& operator >> (Vector& is,Complex& z){
Vector copie(is);
is.~Vector();
// is.Vector::Vector(is.dim+1);
new(&is) Vector(is.dim + 1);
return is;
}
即使这样,代码在语义上也可能不正确
话虽如此,但这并不是推荐的方法
过去20年。请看下面的解释(示例几乎相同)。这个
建议的方法是在其他操作(如
复制或交换
次要的语法细节,
operator>
容易混淆,使用operator无需调用析构函数和构造函数。您可以采取以下步骤使功能正常工作:
分配内存以保存当前对象和附加对象
将对象从旧内存位置复制到新内存位置
删除旧内存
将新分配的内存与输入对象关联
话虽如此,我认为您使用了错误的函数将元素插入到Vector
<代码>运算符>>
用于从中提取数据Operator我想你可以使用placementnew
,但这整件事让我害怕。这不仅完全破坏了is
的旧内容,它也不会将新的复杂的对象复制到is
。@RSahu,我同意,这就是我所说的代码在语义上可能仍然不正确的方式。问题在于构造函数,而不是如何让代码做正确的事情。
friend Vector& operator >> (Vector& is,Complex& z){
Vector copie(is);
is.~Vector();
// is.Vector::Vector(is.dim+1);
new(&is) Vector(is.dim + 1);
return is;
}
friend Vector& operator>>(Vector& is, Complex& z){
// Allocate memory
Complex* vnew = new Complex[dim+1];
// Copy objects to new memory.
std::copy(is.v, is.v + is.dim, vnew);
vnew[is.dim] = z;
// Delete the old memory.
delete [] is.v;
// Use the new memory
is.v = vnew;
// Increment dim.
is.dim++;
return is;
}
friend Vector& operator<<(Vector& is, Complex const& z){
...
}