#c #class #constructor
#c #класс #конструктор
Вопрос:
В моем примере я создал класс Person, который имеет объект-член: struct data . Этот объект содержит данные о человеке. Каждый раз, когда создается объект Person, также должен инициализироваться объект data.
Наблюдение: при добавлении инициализатора объекта в код (1) в конструкторе класса я получаю сообщение об ошибке:
неполный тип не разрешенc / C (70)
class person {
public:
struct data;
person() { /* (1) */
person::data myPersonData;
}
private:
};
Итак, вот как я это практикую сейчас:
- Нет инициализации объекта struct myPersonData в конструкторе класса person (class_person.hpp)
- Создайте объект person в main.cpp
- Создайте myPersonData в main.cpp (Я хотел бы сохранить эту инициализацию и поместить ее в конструктор класса)
Весь пример выглядит так:
// class_person.hpp
#include <iostream>
#include <string>
class person {
public:
struct data;
private:
};
struct person::data {
std::string name = "John";
int age = 42;
int weight = 75;
};
_
// main.cpp
#include <iostream>
#include "class_person.hpp"
void outputPersonData(person::data myPerson) {
std::cout << myPerson.name << "n";
std::cout << myPerson.age << "yearsn";
std::cout << myPerson.weight << "kgn";
};
int main() {
person John;
person::data myPersonData;
outputPersonData(myPersonData);
getchar();
return 0;
}
Комментарии:
1.
struct data;
просто объявляетperson::data
; в структуре отсутствует определение и, следовательно, она неполная
Ответ №1:
Вы должны поместить определение data
внутри определения person
, если вы хотите его член. Что-то вроде этого.
#include <string>
#include <iostream>
class person {
public:
struct data {
std::string name = "John";
int age = 42;
int weight = 75;
};
// This is just the definition the the class. We need the class
// to have a definition if we want to use a value of it in person
person() = default;
// Default constructors, give us a default constructed personData
// that uses the default values from the definition
person(data d) : personData(std::move(d)) {}
// Constructor that takes a personData object and uses it to
// initialize our member. std::move is to avoid uneccesary copying
void outputPersonData() const {
std::cout << personData.name << "n";
std::cout << personData.age << "yearsn";
std::cout << personData.weight << "kgn";
}
data personData;
// This is the actual data member, now person contains
// a member named personData of type person::data
};
int main() {
person john;
person mike({"Mike", 47, 82});
john.outputPersonData();
mike.outputPersonData();
}