#c #class #constructor #initialization
#c #класс #конструктор #инициализация
Вопрос:
По сути, чего я пытаюсь достичь, так это создать локальный (и частный) экземпляр класса deltaKinematics
в классе geneticAlgorithm
В geneticAlgorithm.h
файле у меня есть:
class DeltaKinematics; //class is defined in separate linked files
class GeneticAlgorithm {
//private
DeltaKinematics deltaRobot;
public:
GeneticAlgorithm(); //constructor
};
Все это прекрасно, но когда я перехожу к объявлению GeneticAlgorithm
конструктора, я не могу понять, как создать экземпляр DeltaKinematics
Это geneticAlgorithm.cpp
конструктор:
GeneticAlgorithm::GeneticAlgorithm(){ //The error given on this line is "constructor for 'GeneticAlgorithm' must explicitly initialize the member 'deltaRobot' which does not have a default constructor"
DeltaKinematics deltaRobot(100); //this clearly isn't doing the trick
cout << "Genetic Algorithmic search class initiated n";
}
Как мне приступить к инициализации этого локального экземпляра?
Ответ №1:
Список инициализаторов участников:
GeneticAlgorithm::GeneticAlgorithm() : deltaRobot(100) {
}
Комментарии:
1. Спасибо @Erik, вот чего я добивался. Из интереса, как называется эта языковая конструкция? Я очень новичок в c и все еще разбираюсь в жаргоне
2. Это список инициализаторов элементов, используемый для инициализации базовых классов и переменных-членов. Обратите внимание, что они будут вызываться в том порядке, в котором объявлены переменные-члены, а не в том порядке, в котором вы их указываете. Вы можете инициализировать несколько элементов следующим образом:
Foo::Foo() : BaseClass(0), MemVar(1), AnotherMemVar(2) {}
3. что, если это 100 не константа, а переменная, которая требует вычисления некоторой логики перед передачей конструктору
4. Используйте статическую функцию для получения значения.
Ответ №2:
GeneticAlgorithm::GeneticAlgorithm() : deltaRobot(100) {
cout << "Genetic Algorithmic search class initiated n";
}
Обратите внимание на :
после имени конструктора: это начало последовательности инициализации для переменных данных-членов класса. Они отображаются как вызовы своих конструкторов с параметрами, которые вы хотите передать, и должны быть в том же порядке, в котором они объявлены.
Комментарии:
1.
:
запускает инициализаторы членов, как базовых классов, так и переменных-членов. И нет, им не обязательно быть в порядке объявления, но они будут вызываться в порядке объявления.2. Ну, на самом деле это зависит от компилятора, некоторые компиляторы, которые я использовал, настаивают на порядке и выдают предупреждения, если порядок не совпадает.
3. Нет требования, чтобы вы размещали инициализаторы в том порядке, в котором были объявлены переменные-члены. Gcc, например, предупреждает, если вы этого не сделаете, но компилятор, который считает неправильный порядок инициализаторов ошибкой , просто некорректен.