Исходя из ваших комментариев, которые я думаю, что вы путаете несколько понятий здесь: состава, вложенных классов, экземплярами. Или я не понимаю ваш вопрос и удалю/отредактирую ответ.
Когда вы говорите «экземпляры сестер в пределах одной структуры« Я думаю, вы действительно ищете композицию. Как и в , существует соотношение. Вам не нужно иметь вложенные классы для создания композиции. Для композиции вам нужны переменные-члены.
Возможно, что вы действительно хотите что-то вроде этого, поправьте меня, если я ошибаюсь:
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();
}
или пользовательские классы могут иметь указатель на пользовательские оболочки и общаться со своими сестрами через обертку.
У вас недостаточно кода, чтобы продемонстрировать, как вы собираетесь использовать свои внутренние классы. Класс - это тип, а нестатические методы должны быть вызваны против экземпляра. – jxh
Где ваше чувство приключений? Попробуй. Посмотрите, работает ли это. Если что-то не работает, что вы думаете, должно работать, спросите здесь подробности. Если что-то работает, что, по вашему мнению, не должно работать, еще раз спросите здесь подробности. –
BTW, C++ имеет функции-члены. При определенных обстоятельствах, которые не применяются в вашем примере, они могут получить большую часть семантики теоретических методов CS. –