如何在C++中使用for循环创建多个对象?

Lis*_*isa 9 c++ object

我试图使用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对象数组.


这个问题有两种合理的解决方案:

  1. 您可以向Genes类添加default/no参数构造函数.这很简单,但缺乏优雅.什么是默认的Genes对象?如果这样的对象有意义,你可能已经声明了一个默认的构造函数.

  2. 请查看使用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)