Как создавать объекты-члены с помощью конструктора класса?

#c #class #constructor

#c #класс #конструктор

Вопрос:

В моем примере я создал класс Person, который имеет объект-член: struct data . Этот объект содержит данные о человеке. Каждый раз, когда создается объект Person, также должен инициализироваться объект data.

Наблюдение: при добавлении инициализатора объекта в код (1) в конструкторе класса я получаю сообщение об ошибке:
неполный тип не разрешенc / C (70)

 class person {
public:
  struct data;
  person() { /* (1) */
    person::data myPersonData;
  }

private:
};
  

Итак, вот как я это практикую сейчас:

  1. Нет инициализации объекта struct myPersonData в конструкторе класса person (class_person.hpp)
  2. Создайте объект person в main.cpp
  3. Создайте 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();
}