Ответы пользователя по тегу ООП
  • Как сделать иерархию классов?

    tsarevfs
    @tsarevfs
    C++ developer
    Почему бы не перенести HP в класс Enemy?
    Ответ написан
    1 комментарий
  • Что кому принадлежит из этих объектов?

    tsarevfs
    @tsarevfs
    C++ developer
    Не стоит плодить сущностей без необходимости. Если сомневаетесь нужен ли пилот или нет, значит скорее всего он не нужен.
    Пилот владеющий самолетом ситуация чуть более экзотичная как мне кажется. Если взять игру симулятор, то кажется логичным что пилот находится в системе координат самолета а не наоборот.
    Ответ написан
  • Можно ли в С++ стрингу преобразовать в тип?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Хорошего способа сделать этого нет.

    Паттерн который позволяет избавиться от if-ов называется Factory. Есть разные способы его реализации. Основная идея в том, что есть класс FunctionFactory который хранит map name->createFunc. Где createFunc это функция которая создает нужный экземпляр. Но этот map тоже нужно заполнить, поэтому совсем не писать лишний код не получится.
    Это все безобразие позволяет не иметь огромной функции которая знает про все зарегистрированные классы.

    Тут есть пример правильного кода
    https://dzone.com/articles/factory-with-self-regis...
    Ответ написан
    Комментировать
  • Как в моём коде можно реализовать сортировку и поиск по “степени риска”?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    1. Функция сортировки из стандартной библиотеки: https://en.cppreference.com/w/cpp/algorithm/sort. Обратите пример с lambda функцией. В вашем случае ее параметры будут указатели на Derivativ, и в теле будет сравнение по соответствующему свойству.
    2. У обычного массива нет begin() и end(). Используйте vector вместо массива или https://en.cppreference.com/w/cpp/iterator/begin
    3. Массив со страховками у вас создается только если выбрана 1. Немного логичнее если он будет жить все время работы программы.
    4. Сортировка меняет массив. Вероятно "2" должна создавать копию массива, сортировать его и печатать.
    5. Используйте std::string для хранения строк. Жить станет немного проще и веселее.
    5. Derivative Это что-то производное от чего-то. А у вас наоборот от него производят. Insurance или BaseInsurance более подходящее имя.
    Ответ написан
    Комментировать
  • Как конкретного наследника связать с конкретным родителем?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Отношение наследования в реальном мире лучше всего описывается словом "является". Каждый ComPort является девайсом, а обратное не верно (вероятно девайсы бывают разные, иначе не понятно зачем такой класс вовсе). Значит Device должен быть базовым классом.
    Далее, что касается связи двух экземпляров. Каждый экземпляр класса ComPort и так является Device благодаря наследованию. Функция write у девайса может быть виртуальной и абстрактной (=0 не имеющей своей реализации). В ComPort она будет оверрайдиться уже с конкретной реализацией для порта.
    Таким образом вы можете иметь:
    Device * d = new ComPort(setting1, setting2);
    d.write(data);

    в этом случае write будет вызван с нужными настройками (setting1, setting2).

    Более того, такой подход позволит использовать разные девайсы единообразно:
    std::vector<Device *> ds;
    ds.push_back(new ComPort(setting1, setting2));
    ds.push_back(new UsbPort(setting3, setting4));
    
    for (auto d : ds)
       d->write(data);
    </code
    Ответ написан
    Комментировать
  • Общеразвивающий скриптовый ООП язык - что взять для саморазвития?

    tsarevfs
    @tsarevfs
    C++ developer
    ООП в скриптовых языках не играет такую большую роль как в языках со статической типизацией. Но для обучения можно что-то на python написать.
    Ответ написан
    Комментировать
  • Можно ли перегружать базовые типы в С++?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Это определенно плохая идея. Если вы хотите удобно сравнивать строки используйте std::string.
    Ответ написан
  • Где хранятся закрытые данные базового класса при обращении к ним через производный класс (C++)?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Модификаторы доступа совершенно не влияют на представление данных. Грубо говоря если в некотором коде заменить все private на public в результате компиляции ничего не изменится. Эти модификаторы ограничивают только то, что можно использовать в C++ коде.
    Ответ написан
    Комментировать
  • Как понять суть программирования (подробнее в содержании)?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Посмотреть на то как создается рисунок действительно проще, но прежде чем удастся нарисовать что-то хорошо, придется потратить кучу времени и сил.
    Для того чтобы получить минимальное представление о программировании не обязательно тратить годы. Пройдите онлайн курс по языку, например питон неплох для быстрого старта:
    python-rutour.rhcloud.com
    или
    www.codecademy.com (если хоть немного знакомы с английским)
    Если пойдет, то читайте книги по языку и алгоритмам. Если позволяют средства, позанимайтесь с учителем или в группе.
    Не ожидайте что все будет просто.
    Ответ написан
    2 комментария
  • Почему не работает return?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Используйте отступы для выделения блоков, ничего же не понятно!
    void add_animal(){
      int i;
      for (i = 0; i < SIZE; ++i){
        if (!anim[i].animal) break; //WAT??? Для массивов char это не сработает как
                //проверка на пустоту строки, тем более неинициализированные массивы забиты мусором.
                //Удобнее использовать std::string и проверять (!animal.empty())
        if (i == SIZE){ cout << "Its full"; return; }  //никогда не выполнится по условию цикла
        
        
      }
      anim[i].input(); //Это вы хотели сделать в цикле, с отступами бы вы это заметили!
      return;
    }

    Ну и все в manager нужно запихнуть в while(true) и сделать return в case 3 например.
    Ответ написан
    Комментировать
  • О наследовании в ООП. Как узнать имя производного класса из базового?

    tsarevfs
    @tsarevfs
    C++ developer
    Если нельзя просто добавить виртуальную функцию, можно попробовать получать информацию о типе с помощью typeid. Подозрительно, что такая задача возникла.
    Ответ написан