创建自定义类型对象的向量

Aja*_*jay 1 c++ vector

当我尝试编译我编写的这段代码时,我遇到了一些令人困惑的编译错误.想法是创建一个对象"分子",它具有"原子"类型的向量.从包含原子的x,y,z坐标及其Z值的文件中读取每个原子.这是我的代码示例.我已将我的错误追溯到向量,因此我将在下面显示与之关联的所有代码.该程序有点大,它在没有Atom类之前工作(我实现了原子向量来替换在分子类中保持几何的嵌套数组,我试图学习如何使用向量).

我将矢量初始化为分子类的私有成员,名称为atoms,类型为Atom,

class Molecule {
private:
     std::vector<Atom> atoms;
     // other declarations to follow
 } 
Run Code Online (Sandbox Code Playgroud)

然后在分子类的构造函数中,我从文件中读取原子数,并将我的矢量原子调整为该数字

 file.open("geom.dat", ios::in);


 if(file.is_open())
{
    file >> natom;
    atoms.resize (natom);
Run Code Online (Sandbox Code Playgroud)

然后继续读取同一个文件,在文件的每一行向向量中添加一个原子.

    while(!file.eof())
    {
        int a;
        double b,c,d;

        file >> a >> b >> c >> d;
        Atom A(a,b,c,d);
        atoms.push_back(A);
    }
Run Code Online (Sandbox Code Playgroud)

我编译时收到的错误看起来像是乱码,他们引用了我没有编写过的代码行.这是一个例子

 In file included from molecule.cpp:3:
 In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/iostream:38:
 In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/ios:216:
 In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/__locale:15:
 In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/string:439:
 In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/algorithm:627:
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/memory:1456:36: error: no matching
 constructor for initialization of 'Atom'
            ::new ((void*)__p) _Tp();
Run Code Online (Sandbox Code Playgroud)

我的向量声明或填充方式是否存在问题.如果向量不是我编译错误的来源,我可以发布更多代码,但这是我改变的唯一一方.

As Requested Atom类:头文件:

class Atom 
{
private:
    int Zval;
    double x;
    double y;
    double z; 

public:
    Atom(int zv, double xcart, double ycart, double zcart);
    ~Atom();
    int get_Zval();
    double get_x();
    void ch_x(double val);
    double get_y();
    void ch_y(double val);
    double get_z();
    void ch_z(double val);

};
Run Code Online (Sandbox Code Playgroud)

和atom类的源文件:

Atom::Atom(int zv, double xcart, double ycart, double zcart)
: Zval(zv), x(xcart),y(ycart), z(zcart)  { }
int Atom::get_Zval(){   return Zval;    }

double Atom::get_x() {  return x;   }

void Atom::ch_x(double val) {   x+= val;    }

double Atom::get_y(){   return y;   }

void Atom::ch_y(double val) {   y+= val;    }

double Atom::get_z() {  return z;   }

void Atom::ch_z(double val) {   z+= val;    }
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 6

编译器正在查找类中的默​​认构造函数Atom,但它没有默认构造函数.需要默认构造函数的原因是因为这一行:

atoms.resize (natom);
Run Code Online (Sandbox Code Playgroud)

resize() 如果新大小大于当前大小,则向向量添加新元素,并且这些新元素是默认构造的.

你真正想要的是reserve():

atoms.reserve (natom);
Run Code Online (Sandbox Code Playgroud)

它只是为存储元素分配内存,但实际上并没有添加任何元素.如果使用resize(),最终会增加原始输入文件中两倍的原子数 - 一半是默认构造的,与文件数据无关,另一半是从文件数据中构造的值.

或者,只需删除resize()/ reserve()allogether,然后push_back()在需要时重新分配向量.但是因为你提前知道要添加多少原子,reserve()所以使用是一件好事,因为向量只需要分配一次(除非你在加载文件后添加更多原子).