在C中,使用new []创建一个数组使用其默认/无参数构造函数初始化所有对象.
所以这一行:(分号添加)
Genes *genes=new Genes[10];
将导致Genes :: Genes()的十个呼叫.
这通常看起来很好,因为当你不声明任何时候,C会给你一个默认的构造函数.但是,为了实现这一点,您不能声明任何构造函数.你的构造函数:
Genes::Genes(double a, double b, double c)
防止编译器为您创建一个默认构造函数,这反过来又会阻止您创建一个Genes对象数组.
这个问题有两个合理的解决方案:
>您可以向Genes类添加一个默认/无参数构造函数.这很简单,但缺乏一些优雅.什么是默认的Genes对象?如果这样的对象是有意义的,那么你可能已经声明了一个默认构造函数.
>查看使用std :: vector而不是数组:http://www.cplusplus.com/reference/stl/vector/.虽然这在短期内是一个更复杂的解决方案,但熟悉标准模板库(提供向量类)将在长期内具有价值.也就是说,如果你刚刚学习C,以前没有看过模板,这可能有点压倒性,你可能想先阅读一些有关模板的内容. (例如http://www.learncpp.com/cpp-tutorial/143-template-classes/)
矢量类允许您声明一个容量,您将放入数组中的对象数量(或者您不能声明容量,导致较慢的插入).然后,当它们被放置到向量中时,它将仅构造对象.你的代码看起来像这样:
#include // to get the vector class definition
using std::vector; // to
vector genes;
genes.reserve(geneno); // optional, but speeds things up a bit
for(i = 0; i <= geneno; i++) {
double d = random();
double e = random();
double f = random();
genes.push_back(Genes(d, e, f));
}
最后一句话(大致)相当于:
Genes temp(d, e, f);
genes.push_back(temp);
您可以随后以与阵列相同的方式访问向量中的元素:
cout << "The third gene's coding is " << genes[3].coding << endl;
您可以使用vector :: size()查询向量的大小:
cout << "The vector has " << genes.size() << "elements" << endl;