Я пытаюсь создать структуру с тремя классами в качестве членов, и для моей идеи работы я хочу, чтобы экземпляры моих классов имели возможность обращаться к экземплярам сестер внутри одной структуры. Поэтому, допустим, после инициализации struct
я хочу, чтобы мой custom_class_one
смог вызвать методы инициализации sister custom_class_two
. Возможно ли это сделать? Вот мой заголовочный файл:
struct custom_wrapper
{
public:
custom_wrapper();
class custom_class_one
{
private:
int number1;
public:
int getNumber1();
};
class custom_class_two
{
private:
int number2;
public:
int getNumber2();
};
class custom_class_three
{
private:
int number3;
public:
int getNumber3();
};
};
Основываясь на ваших комментариях, я думаю, что вы вводите в заблуждение несколько понятий здесь: состав, вложенные классы, экземпляры. Или я не понимаю ваш вопрос и удалю/отредактирую ответ.
Когда вы говорите "экземпляры сестер внутри одной структуры", я думаю, вы действительно ищете композицию. Как в отношениях есть. Вам не нужно иметь вложенные классы для создания композиции. Для композиции вам нужны переменные-члены.
Возможно, то, что вы действительно хотите, это что-то вроде этого, исправьте меня, если я ошибаюсь:
struct CustomClassA {
private:
int number;
public:
int getNumber() { return number; }
};
struct CustomClassB {
private:
int number;
public:
int getNumber() { return number; }
};
struct CustomClassC {
private:
int number;
public:
int getNumber() { return number; }
};
struct CustomWrapper {
private:
CustomClassA a;
CustomClassB b;
CustomClassC c;
};
Итак, если вы создаете экземпляр CustomWrapper
него есть экземпляры пользовательских классов a
, b
и c
. Он "владеет" ими.
И тогда вы хотите, чтобы три пользовательских класса могли общаться друг с другом. Существует ряд способов достижения этого. Пользовательские классы могут иметь указатели на другие классы сестры. Они могут быть установлены в конструкторе CustomWrapper
:
#include <iostream>
struct CustomClassB; // Forward declaration for member pointer in CustomClassA.
struct CustomClassA {
private:
int number;
CustomClassB* b; // Member pointer to CustomClassB.
public:
CustomClassA() : number(1), b(nullptr) {} // Initialized sister b to nullptr.
void setSisterB(CustomClassB *sister_b) { b = sister_b; }
int getNumber() { return number; }
};
struct CustomClassB {
private:
int number;
CustomClassA* a;
public:
CustomClassB() : number(2), a(nullptr) {}
void setSisterA(CustomClassA *sister_a) { a = sister_a; }
int getNumber() {
if (a) // Check a is not null
return a->getNumber() + number; // Use pointer to sister a
return number;
}
};
struct CustomClassC {
private:
int number;
CustomClassA* a;
CustomClassB* b;
public:
CustomClassC() : number(4), a(nullptr), b(nullptr) {}
void setSisterA(CustomClassA* sister_a) { a = sister_a; }
void setSisterB(CustomClassB* sister_b) { b = sister_b; }
int getNumber() { return number; }
};
struct CustomWrapper {
private:
CustomClassA a;
CustomClassB b;
CustomClassC c;
public:
CustomWrapper() {
a.setSisterB(&b); // Set the pointers to the sister custom
b.setSisterA(&a); // classes in each custom class in the
c.setSisterA(&a); // constructor of CustomWrapper.
c.setSisterB(&b);
}
int getAnswer() {
return b.getNumber() + c.getNumber();
}
};
int main() {
CustomWrapper wrapper;
std::cout << wrapper.getAnswer();
}
Или пользовательские классы могут иметь указатель на пользовательскую оболочку и общаться со своими сестрами через оболочку.
Пока ваши методы доступны, и классы могут видеть друг друга (пересылать объявление, если необходимо), это можно сделать:
struct custom_wrapper
{
public:
custom_wrapper();
class custom_class_two; // Forward declaration for inner class
class custom_class_one
{
private:
int number1;
public:
int getNumber1();
int accessSisterMethods(custom_class_two& obj) {
return obj.getNumber2();
}
};
class custom_class_two
{
private:
int number2;
public:
int getNumber2() {
return 42;
}
};
class custom_class_three
{
private:
int number3;
public:
int getNumber3();
};
};
int main()
{
custom_wrapper::custom_class_one obj1;
custom_wrapper::custom_class_two obj2; // Need a sister object
std::cout << obj1.accessSisterMethods(obj2);
}
Конечно, вам нужен экземпляр другого класса сестры (если вы не вызываете статические методы, но я рассматриваю код, который вы опубликовали).