Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 显式调用ctor以分配内存_C++11 - Fatal编程技术网

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我想你可以使用placement
    new
    ,但这整件事让我害怕。这不仅完全破坏了
    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){
      ...
    }