考虑以下课程:
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);}
};
我尝试重载>> operator
以便向v
添加元素。
我的想法是创建一个副本,然后调用dctor和对象的ctor
通过>>
运算符进行修改。
在收到错误后:
In function ‘Vector& operator>>(Vector&, Complex&)’:
main.cc:56:20: error: cannot call constructor ‘Vector::Vector’ directly
is.Vector::Vector(is.dim+1);
我不允许使用容器!! 请帮帮我!
答案 0 :(得分: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年。观看此Jon Kalb "Exception-Safe Code, Part I"以获得解释(示例几乎相同)。该 推荐的方法是在其他操作方面实现这一点 复制或交换。
轻微的语法细节,operator>>
令人困惑,最糟糕的情况下使用operator<<
。
答案 1 :(得分:0)
无需调用析构函数并调用构造函数。您可以采取的步骤使您的功能发挥作用:
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;
}
话虽如此,我认为您使用错误的函数将元素插入Vector
。 operator>>
用于从中提取数据。 operator<<
用于插入数据。您应该使用operator<<
将元素插入Vector
。
friend Vector& operator<<(Vector& is, Complex const& z){
...
}