微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何用C中的for循环创建多个对象?

我试图使用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;

原文地址:https://www.jb51.cc/c/114546.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐