我试图使用for循环创建多个对象,因为最终我会希望这个程序根据我的输入创建不同数量的类.我试图使用上一个
question的答案写这个.但是,当我尝试编译时,我得到错误’没有匹配的功能调用’Genes :: Genes()’
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; float random(); class Genes{ public: double cis; double coding; double effect; Genes(double a,double b,double c); }; Genes::Genes(double a,double c) { cis=a; coding=b; effect=c; }; int main() { int geneno,i; srand(time(NULL)); geneno=4; //this will probably be cin later Genes *genes=new Genes[10] for(i=0;i<=geneno;i++){ double d,e,f; d=random(); e=random(); f=random(); genes[i]=Genes(d,f); cout<<"cis is "<<genes.cis<<'\n'; cout<<"coding is "<<genes.coding<<'\n'; cout<<"Effect for gene is "<<genes.effect<<'\n'; } delete[] genes; } float random(){ float decRANDMAX; decRANDMAX=RAND_MAX*1.0; return rand()%(RAND_MAX+1)/decRANDMAX; }
解决方法
在C中,使用new []创建一个数组使用其默认/无参数构造函数初始化所有对象.
所以这一行:(分号添加)
Genes *genes=new Genes[10];
将导致Genes :: Genes()的十个呼叫.
这通常看起来很好,因为当你不声明任何时候,C会给你一个默认的构造函数.但是,为了实现这一点,您不能声明任何构造函数.你的构造函数:
Genes::Genes(double a,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 <vector> // to get the vector class definition using std::vector; // to vector<Genes> 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,f)); }
最后一句话(大致)相当于:
Genes temp(d,f); genes.push_back(temp);
vector :: push_back将一个项目添加到向量的背面,并将向量容量增加1:http://www.cplusplus.com/reference/stl/vector/push_back/
您可以随后以与阵列相同的方式访问向量中的元素:
cout << "The third gene's coding is " << genes[3].coding << endl;
您可以使用vector :: size()查询向量的大小:
cout << "The vector has " << genes.size() << "elements" << endl;