我试图使用for循环创建多个对象,因为最终我希望这个程序根据我的输入创建不同数量的类.我试着用前一个问题的答案来写这个.但是,当我尝试编译时,我得到错误'没有匹配函数来调用'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 b, 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,e,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;
}
Run Code Online (Sandbox Code Playgroud)
Ker*_* SB 10
使用惯用的C++并为作业选择合适的容器(即vector):
#include <vector>
const std::size_t num_genes; // your data here
//...
std::vector<Genes> v;
v.reserve(num_genes);
for (std::size_t i = 0; i != num_genes; ++i)
{
v.push_back(Genes(random(), random(), random())); // old-style
v.emplace_back(random(), random(), random()); // modern (C++11)
}
Run Code Online (Sandbox Code Playgroud)
现在,你有你的元素v[0],v[1]等等.
小智 8
在C++中,使用new []创建数组会使用其默认/无参数构造函数初始化所有对象.
所以这一行:(分号添加)
Genes *genes=new Genes[10];
Run Code Online (Sandbox Code Playgroud)
将导致对Genes :: Genes()的十次调用.
这通常看起来很好,因为当你没有声明任何东西时,C++会给你一个默认的构造函数.但是,为此,您不得声明任何构造函数.你的构造函数:
Genes::Genes(double a, double b, double c)
Run Code Online (Sandbox Code Playgroud)
阻止编译器为您创建默认构造函数,这反过来又阻止您创建Genes对象数组.
这个问题有两种合理的解决方案:
您可以向Genes类添加default/no参数构造函数.这很简单,但缺乏优雅.什么是默认的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, e, f));
}
Run Code Online (Sandbox Code Playgroud)
最后一个陈述(大致)等同于:
Genes temp(d, e, f);
genes.push_back(temp);
Run Code Online (Sandbox Code Playgroud)
vector :: push_back在向量的后面添加一个项目,并将向量容量增加1:http://www.cplusplus.com/reference/stl/vector/push_back/
您可以随后以与数组相同的方式访问向量中的元素:
cout << "The third gene's coding is " << genes[3].coding << endl;
Run Code Online (Sandbox Code Playgroud)
您可以使用vector :: size()查询向量的大小:
cout << "The vector has " << genes.size() << "elements" << endl;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30895 次 |
| 最近记录: |