Ответы пользователя по тегу C++
  • Что читать, чтобы получить знания по серверному программированию C/C++?

    @hsc
    full stack python back-end developer
    Очень многое зависит от протокола обмена данными, который вы выберете для своего приложения. Если Вам удастся подстроить поток данных под http, то, наверное, есть смысл взглянуть на технологии отличные от C/C++. Например, как вариант, можно смотреть на python. Для него реализована масса http-серверов всех мастей. Данный выбор хорош тем, что, во-первых, позволит быстрее написать прототип системы, даже если Вы не знакомы с python, ведь Вам не придется изучать основы сети, а достаточно будет воспольоваться высокоуровневыми абстракциями, а это значит, что время на изучение сети можно будет потратить на дополнительный ЯП. Во-вторых, Вы сможете куда более легче и быстрее прикрутить сторонние приложения типа redis, memcached, всевозможных БД и пр. В третьих, этот вариант хорош более легким масштабированием. Вам могут также посоветовать python и сказать, что в случае необходимости критичные к скорости участки программы можно будет переписать на С, но мой Вам совет — рассматривайте этот аргумент в последнюю очередь. Но это вариант не без минусов: скорость python куда более медленней чем С/С++. На моей практике был случай, когда python просел на вычислениях в ~50 раз. Тут очень много зависит от задач сервера. Во-вторых, потребляется побольше ресурсов. Готовьтесь к приростам в 5-10раз.

    Сам по себе http уже сможет гарантировать доставку данных и наложит некоторые правильные ограничения на их поток. Кроме того, он позволит несколько проще управлять кешированием, что тоже немаловажно.

    Если же все-таки решите писать свой протокол на основе TCP/IP или UDP взгляните на boost::asio. В мире С++ он зарекомендовал себя как достаточно быстрый и эффективный тулкит для работы с сетью. Документация у него средненькая, часто нужно будет бегать по форумах, но основные вещи описаны нормально. Есть примеры. Также, для более быстрого входа в тему программирования сети с опусканием нюансов очень низких уровней можно взглянуть на документацию по сети в Qt. Там описано много нюансов, даны очень хорошие примеры, можно подсмотреть много хороших практик проектирования сетевых подсистем.

    Напоследок скажу, что если на С/С++ выбор падает из-за возможно большей производительности, то не забывайте, что от сети зависит только часть производительности, но есть еще и управление памятью, ресурсами, задачами сервера (читай тредами) и т.д. Готовы ли Вы к этому?
    Ответ написан
    Комментировать
  • Как средствами C++ создать экземпляр класса, видимого из методов другого класса?

    @hsc
    full stack python back-end developer
    Строго говоря, использование глобальных переменных в С++ встречается редко. Это допустимо, но по большей мере для обеспечения совместимости с С. В С++ для передачи контекста используют другие приемы, например "передачу по указателю" (ниже). Стоит также сказать, что глобальные переменные сопряжены с кое-какими нюансами, например, могут возникнуть проблемы с последовательностью инициализации.

    Но, судя по Вашему вопросу, Вам не нужны глобальные переменные. Достаточно будет кода на подобие этого:

    /* 
     * gameinstancehandler.h 
     */
    
    class GameInstanceHandler{
    public:
        GameInstanceHandler(CGameHud *instance):
            mInstance(instance){}
    
    private:
        CGameHud *mInstance;
        // something other here
    }


    #inlucde <gameinstancehandler>
    
    int main(int argc, char **args){
        CGameHudInstance *gameHub = new CGameHud(argc, args);
        GameInstanceHandler *handler = new GameInstanceHandler(gameHub);
    
        return 0;
    }


    Здесь контекст передается по указателю. Объекты, поведение которых зависит от других, уже созданных объектов, просто получают указатели на них в конструкторе, сохраняют его "у себя" и взаимодействуют с ними через сохраненную копию указателя.

    P.S. Поскольку вопрос новичковый, позволю себе дать еще один совет: во время объявления указателя пишите звездочку перед идентификатором, а не после типа.
    int *a; // хорошо, a — это указатель.
    int* b; // плохо, но допустимо.
    int* c, d; // совсем плохо, c — указатель на int, d — просто переменная типа int.
    
    int *e, *f; // при такой же записи все понятно сразу.
    Ответ написан
    Комментировать