显式调用ctor以分配内存

时间:2017-04-27 21:00:03

标签: 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]){
        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);

允许使用容器!! 请帮帮我!

2 个答案:

答案 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)

无需调用析构函数并调用构造函数。您可以采取的步骤使您的功能发挥作用:

  1. 分配内存以保存当前对象和其他对象。
  2. 将对象从旧内存位置复制到新内存位置。
  3. 删除旧内存。
  4. 将新分配的内存与输入对象相关联。
  5. 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;
    }
    

    话虽如此,我认为您使用错误的函数将元素插入Vectoroperator>>用于从中提取数据。 operator<<用于插入数据。您应该使用operator<<将元素插入Vector

    friend Vector& operator<<(Vector& is, Complex const& z){
      ...
    }