grig_p
05 березня 2022 р. 13:33

Работа с классами

Здравствуйте!
Столкнулся с проблемой. Не знаю, как к ней подойти.
Допустим, есть суперкласс и несколько подклассов, количество которых со временем будет расти. В этих классах имебтся статичные методы, имеющие один смысл, но работающие чуть по разному.

  1. class Base
  2. {
  3. }
  4.  
  5. class C1 : public Base
  6. {
  7. static void read();
  8. static void write();
  9. static void open();
  10. static void close();
  11. ...
  12. }
  13.  
  14. class C2 : public Base
  15. {
  16. static void read();
  17. static void write();
  18. static void open();
  19. static void close();
  20. ...
  21. }
  22.  

Мне нужно в зависимости от некоего строкового значения:
1) вызывать статичные методы нужного класса
2) создвавть экземпляры классов
Для вызова статичного метода просматривается следующий путь:

  1. if (st == StringValue1)
  2. C1::read();
  3. else
  4. if (st == StringValue2)
  5. C2::read();
  6. ...
  7.  

Для создания экземпляра:

  1. Base *base{nullptr} ;
  2. if (st == StringValue1)
  3. base = new C1();
  4. else
  5. if (st == StringValue2)
  6. base = new C2();
  7. ...
  8.  

И так далее. Для вызова каждого метода нужно создавать линейку if - else if, что громоздко и в последствие сложно сопровождаемо.

Вопрос, можно ли как-то это упростить? Можно ли указать список в одном месте, а потом вызывать методы?
Буду очень благодарен за помощь.
С уважением, Григорий

2

Вам це подобається? Поділіться в соціальних мережах!

3
Виктор Калесников
  • 05 березня 2022 р. 15:02
  • (відредаговано)

Использовать switch и enum.

    Виктор Калесников
    • 05 березня 2022 р. 15:08
    • (відредаговано)

    Если совсем красиво делать то применить шаблон ООП "Стратегия"

      grig_p
      • 05 березня 2022 р. 15:17

      Спасибо.
      Но разве в switch можно использовать строки, как ключи?
      А чем поможет enum?

        Коментарі

        Only authorized users can post comments.
        Please, Log in or Sign up
        • Останні коментарі
        • Evgenii Legotckoi
          16 квітня 2025 р. 17:08
          Благодарю за отзыв. И вам желаю всяческих успехов!
        • IscanderChe
          12 квітня 2025 р. 17:12
          Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
        • AK
          01 квітня 2025 р. 11:41
          Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
        • Evgenii Legotckoi
          09 березня 2025 р. 21:02
          К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
        • VP
          09 березня 2025 р. 16:14
          Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…