Доступ к экземпляру сестринского класса

0

Я пытаюсь создать структуру с тремя классами в качестве членов, и для моей идеи работы я хочу, чтобы экземпляры моих классов имели возможность обращаться к экземплярам сестер внутри одной структуры. Поэтому, допустим, после инициализации 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();
    };

};

  • 1
    Вы не показали достаточно кода, чтобы продемонстрировать, как вы собираетесь использовать свои внутренние классы. Класс - это тип, и нестандартные методы должны вызываться для экземпляра.
  • 1
    Где твое чувство приключения? Попробуй. Посмотри, работает ли это. Если что-то не работает, как вы думаете, должно работать, спросите здесь с деталями. Если что-то работает, что вы думаете, не должно работать, еще раз, спросите здесь с деталями.
Показать ещё 4 комментария
Теги:

2 ответа

0

Основываясь на ваших комментариях, я думаю, что вы вводите в заблуждение несколько понятий здесь: состав, вложенные классы, экземпляры. Или я не понимаю ваш вопрос и удалю/отредактирую ответ.

Когда вы говорите "экземпляры сестер внутри одной структуры", я думаю, вы действительно ищете композицию. Как в отношениях есть. Вам не нужно иметь вложенные классы для создания композиции. Для композиции вам нужны переменные-члены.

Возможно, то, что вы действительно хотите, это что-то вроде этого, исправьте меня, если я ошибаюсь:

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();
}

Или пользовательские классы могут иметь указатель на пользовательскую оболочку и общаться со своими сестрами через оболочку.

0

Пока ваши методы доступны, и классы могут видеть друг друга (пересылать объявление, если необходимо), это можно сделать:

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);
}

Example

Конечно, вам нужен экземпляр другого класса сестры (если вы не вызываете статические методы, но я рассматриваю код, который вы опубликовали).

  • 0
    В некоторых случаях может также потребоваться использовать определения функций вне строки.
  • 0
    Спасибо, все еще неясно, но по крайней мере у меня есть смутное представление о том, что делать! Не могли бы вы также опубликовать, как вызвать конструктор ребенка в родительском конструкторе?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню