当我尝试编译我编写的这段代码时,我遇到了一些令人困惑的编译错误.想法是创建一个对象"分子",它具有"原子"类型的向量.从包含原子的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)
编译器正在查找类中的默认构造函数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()所以使用是一件好事,因为向量只需要分配一次(除非你在加载文件后添加更多原子).