В C ++ создание массива с помощью new [] инициализирует все объекты их конструктором по умолчанию / без параметров.
Итак, эта строка: (точка с запятой добавлена)
Genes *genes=new Genes[10];
приведет к десяти вызовам Genes :: Genes ().
Обычно это выглядит нормально, поскольку C ++ предоставит вам конструктор по умолчанию, когда вы его не объявляете. Однако, чтобы это произошло, вы не должны объявлять никаких конструкторов. Ваш конструктор:
Genes::Genes(double a, double b, double c)
Запрещает компилятору создавать для вас конструктор по умолчанию, что, в свою очередь, не позволяет создавать массив объектов Genes.
Существует два разумных решения этой проблемы:
Вы можете добавить конструктор по умолчанию / без аргументов в класс Genes. Это просто, но не хватает элегантности. Что такое объект Genes по умолчанию? Если бы такой объект имел смысл, вы, вероятно, уже объявили бы конструктор по умолчанию.
Рассмотрим использование std :: vector вместо массива: http://www.cplusplus.com/reference/stl/vector/. Хотя это более сложное исправление в краткосрочной перспективе, знание Стандартной библиотеки шаблонов (которая предоставляет векторный класс) будет полезно в долгосрочной перспективе. Тем не менее, если вы только изучаете C ++ и не видели шаблонов раньше, это может быть немного ошеломляющим, и вы можете сначала немного прочитать о шаблонах. (например, на http://www.learncpp.com/cpp-tutorial/143-template-classes/)
Класс 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 добавляет элемент в конец вектора и увеличивает емкость вектора на 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;