gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:27:30 25 4
gpt4 key购买 nike

我正在尝试使用 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 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;

}

最佳答案

在 C++ 中,使用 new[] 创建数组会使用默认/无参数构造函数初始化所有对象。

所以这一行:(添加分号)

 Genes *genes=new Genes[10];

将导致对 Genes::Genes() 的十次调用。

这通常看起来不错,因为当您不声明任何构造函数时,C++ 会为您提供一个默认构造函数。但是,要做到这一点,您不得声明任何构造函数。你的构造函数:

Genes::Genes(double a, double b, double c)

阻止编译器为您创建默认构造函数,这反过来又阻止您创建 Genes 对象数组。


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

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

  2. 研究使用 std::vector 而不是数组:http://www.cplusplus.com/reference/stl/vector/ .虽然这在短期内是一个更复杂的修复,但从长远来看,熟悉标准模板库(它提供 vector 类)将是有值(value)的。也就是说,如果您刚刚学习 C++ 并且之前没有见过模板,那么这可能有点让人不知所措,您可能想先阅读一些关于模板的内容。 (例如,在 http://www.learncpp.com/cpp-tutorial/143-template-classes/ )

vector 类允许您声明容量,表示要放入数组中的对象数量(或者您可以不声明容量,导致插入速度变慢)。然后,它只会在将对象放入 vector 中时才构造对象。您的代码看起来像这样:

#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));
}

最后一条语句(大致)等同于:

Genes temp(d, e, f);
genes.push_back(temp);

vector::push_back 将一个项目添加到 vector 的后面并将 vector 容量增加 1:http://www.cplusplus.com/reference/stl/vector/push_back/

您随后可以像访问数组一样访问 vector 中的元素:

cout << "The third gene's coding is " << genes[3].coding << endl;

你可以使用 vector::size() 查询 vector 的大小:

cout << "The vector has " << genes.size() << "elements" << endl;

关于c++ - 如何在 C++ 中使用 for 循环创建多个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8011887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com