C — Как мне инициализировать конструктор отдельного класса из конструктора класса?

#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, например, предупреждает, если вы этого не сделаете, но компилятор, который считает неправильный порядок инициализаторов ошибкой , просто некорректен.