Объявление вашего ребенка в структуре CPP и сохранение его по значению в структуре вашего родителя невозможно. Чтобы дать родительской структуре правильное двоичное представление, необходимо знать, сколько байт принимают члены. Это возможно только в том случае, если детские структуры видны.
Поскольку это C ++, я приму синтаксис к тому, к чему мы привыкли, поэтому вместо struct parent p
я просто буду использовать parent p
.
У вас есть 2options: Первый делает внутренние внутренние структуры приватными:
#ifndef HEADER_H
#define HEADER_H
#include <memory>
struct child1;
struct child2;
struct parent {
std::unique_ptr<child1> c1;
std::unique_ptr<child2> c2;
~parent();
};
#endif
Код в Проводник компилятора
Как вы можете видеть, мы перешли к объявлению 2 дочернихструктурирует и помещает unique_ptr
в родительскую структуру. Это обеспечивает инкапсуляцию. Я также добавил деструктор для родительской структуры, поскольку ваш компилятор должен иметь возможность вызывать деструктор дочерних структур при уничтожении родительской структуры.
Альтернатива 2 более проста в использовании:
#ifndef MYHEADER_H
#define MYHEADER_H
struct parent {
private:
struct child1 {
int thing1;
int thing2;
};
struct child2 {
char letter;
int thing3;
};
public:
int val;
child1 name1;
child2 name2;
};
#endif
Код в Проводник компилятора
В этом методе все определяется в одном заголовочном файле. Он просто помечается как закрытый, поэтому к нему нельзя получить доступ, если он не был функцией родительской структуры. Выделение памяти не требуется, так как теперь мы знаем точный размер дочерних структур.
Исходя из моего опыта, я бы рекомендовал сделать все члены структуры / класса родительскими частными. Для детей это не должно быть доступно вне этой структуры / класса в любом случае. Это облегчит поддержку вашего кода.