Ответы пользователя по тегу C++
  • Как в std::map в ячейку "значение" положить функцию?

    xorknown
    @xorknown
    Будут проблемы - решайте
    В c++ у нестатических функций класса всегда неявно присутствует аргумент который является указателем на объект класса. Таким образом у вас у указателя на функцию start тип -> void (*) (Admin::ServerManager*).

    Вам каким-то образом надо передавать этот указатель, либо исправить что-то в определении функций, для примера можно использовать лямбда функции которые будут содержать в себе указатель.
    Ответ написан
    Комментировать
  • Как вернуть разные типы из std::function?

    xorknown
    @xorknown
    Будут проблемы - решайте
    Идея так делать невероятно плохая, но если хочется можно использовать std::variant(или std::any) из C++17

    std::function func{[](int z) -> std::variant<X, Y> {
                    if (z>0) {
                        return X();
                    }
    
                    return Y();
                }
            };
    
        std::variant<X, Y> v = func(1);
    Ответ написан
    Комментировать
  • Почему не работает эхо сервер на boost::asio?

    xorknown
    @xorknown
    Будут проблемы - решайте
    Проблема в выборе контейнера для сокетов. У вектора есть особенность, он распределяет все свои элементы последовательно в памяти и заранее выделяет под них память. В какой-то момент, при добавлении элемента, к примеру, он может изменить расположение этого последовательного участка в памяти. И получается что в своих потоках вы ссылаетесь на память в которой сокеты уже не находятся. std::vector::reserve лишь временное откладываение проблемы, которая покажет себя при большем кол-ве подключений.
    Следует задуматься о замене вектора на std::list , к примеру, который не имеет данной особенности.
    Ответ написан
  • Как следить за знаком переменной при переполнении в C++?

    xorknown
    @xorknown
    Будут проблемы - решайте
    У вас неправильный подход. Если взять абстрактную машину, то нельзя следить за знаком переменной, так как стандарт не гарантирует, что он изменится. Вам вообще по факту переполнять нельзя.
    Вам надо определить это до самого переполнения. Самый тупой способ - вычесть из максимального числа один из аргументов и сравнить полученное число со вторым аргументом(если полученное число меньше, то значит переполнение).
    Ответ написан
    Комментировать
  • Как получить доступ к наследованной переменной из функции базового класса?

    xorknown
    @xorknown
    Будут проблемы - решайте
    Не уверен, что вы код написали верно. Но чтобы просто получить доступ к переменной имя которой вы скрыли,
    достаточно просто написать имя базового класса::переменная(Base::myvar).
    Вопрос в другом, нужна ли вам переменная myvar в Another?
    UPD: неправильно прочитал.
    Инициализируйте переменную myvar в наследуемом классе. В Another у вас совсем другая переменная которая никак не относится к myvar base, просто уберите ее.
    Если вы хотите инициализировать myvar в конструкторе то вам надо завести конструктор base принимающий аргумент
    class Base {
    protected:
       int myvar;
       void useBaseVar(){
         cout << myvar << endl; // вывод 42
       }
    public:
       Base() : myvar(10) {}
       Base(int  val) : myvar(val) {}
       ~Base() {}
    };
    
    
    class Another : public Base {
    public:
       Another() : Base(42) {}
       void useMyVar() {
         useBaseVar();
       }
    };
    Ответ написан
    3 комментария
  • Как мне записать 1 строку двумерного масива в одномерний?

    xorknown
    @xorknown
    Будут проблемы - решайте
    Не забывайте, что массивы у вас разных размеров, и все строка из ar не влезет в al.
    Старайтесь забыть про сырые массивы и использовать контейнеры.
    for (int i = 0; i < std::size(al); i++) {
        al[i] = ar[0][i];
    }
    Ответ написан
    Комментировать
  • Member with constructor not allowed in anonymous aggregate?

    xorknown
    @xorknown
    Будут проблемы - решайте
    1)
    #define GLFW
    #ifdef GLFW
    
    class GLFW : public IWindowSystem 
    -> class : public IWindowSystem {}


    Вы определяете пустой макрос с именем GLFW, потом создаете класс с таким же названием. Чего вы этим добиваетесь?

    2) Сигнатуры методов IWindowSystem и GLFW отлючаются
    virtual IWindow *createFullScreenWindow(char **title) = 0;
    -> virtual IWindow *createFullScreenWindow(const char *title) {}
    Ответ написан
    2 комментария
  • Обьявление и Определение Шаблона метода?

    xorknown
    @xorknown
    Будут проблемы - решайте
    Если не вдаваться в подробности компиляции, то можно, но есть свои ограничения. Если вы хотите запихнуть реализацию шаблона в cpp файл, то вам надо инстанцировать его после реализации, чтобы компилятор мог использовать ее в других файлах(в который вы включили хэдер с объявлением). Если хотите перенести реализацию в другой хэдер, то вам необходимо включать его во всех cpp файлах где вы хотите его использовать.

    Просто чтобы задуматься. Каждый cpp файл компилируется отдельно от других, и пусть файл с реализацией скомпилируется первым. Как он узнает, для каких шаблонных параметров его надо инстанцировать, если он даже еще не работал с другими файлами? Таким образом когда дойдет до файла в котором вы используете этот шаблон, то нужной вам реализации скорее всего не будет. Поэтому надо вместе с объявлением указывать для каких параметров будет использоваться шаблон. В среднем это не удобно, поэтому так не делают и пишут шаблоны в хэдерах.
    Ответ написан
    Комментировать
  • Из-за чего может отличаться вывод на с++ и python?

    xorknown
    @xorknown
    Будут проблемы - решайте
    Как минимум функции f у вас разные. В c++ вы берете корень из всего выражения, а в питоне только от этой части (1 + x**2)
    Ответ написан
    Комментировать
  • Каким образом лучше управлять памятью?

    xorknown
    @xorknown
    Будут проблемы - решайте
    1) Стандарт гарантирует, что sizeof(char) == 1
    2) В с++, к сожалению, не так много встроенных хороших способов обработки ошибок, поэтому лучше использовать исключения. Они понятны всем, не придется создавать CFB::CompoundFileReader в случае ошибки в GetReader и не будет простыни из if-ов на каждый вызов функции. Но не забывай очищать память и закрывать файлы перед бросанием исключения. Лучше пользоваться RAII.
    3) Smart pointer-ы на самом деле не такие уж и плохие менеджеры памяти, почему бы не использовать их. Из ReadStream можно просто возвращать unique_ptr, а в случае с буффером для CFR, если их время жизни должно совпадать, то почему бы не хранить их вместе.
    class ReaderWatcher {
    public:
        ReaderWatcher(std::shared_ptr<unsigned char[]> b, size_t len)
         : buffer(std::move(b)), reader(b.get(), len) {}
    
        Reader* operator ->() {
            return &reader;
        }
    
        Reader get() {
            return reader;
        }
    
    private:
        std::shared_ptr<unsigned char[]> buffer {nullptr};
        Reader reader;
    };
    Ответ написан
    Комментировать
  • Как скомпилировать проект, если там используется объект еще не существующего класса (C++, пишу библиотеку)?

    xorknown
    @xorknown
    Будут проблемы - решайте
    Во-первых, функции main в библиотеке быть не может, библиотека - просто расширение функционала для проекта в котором будет использоваться. Main - служит начальной точкой для исполняемых приложений, если сильно не извращаться, а следственно должна быть определена только в проекте, который собирается быть исполняемым.

    Во-вторых, в чем проблема с MainScene? Вы просто создаете интерфейс базового класса, потом пользуетесь им получая указатель на объект его реализации, просто необходимо дать пользователю возможность отправить этот указатель вам через какую-либо функцию библиотеки.
    Ответ написан
  • Почему программа сервера не дает следующие подключения?

    xorknown
    @xorknown
    Будут проблемы - решайте
    Не до конца уверен, но по моему на данную строчку кода хотя бы стоит обратить внимание
    while (true)
                {
                    int count = 0;
                    for (int i = 0; i < maxclients; i++)
                        if (args[i].lalk->exit)
                            count++;
                    if (count == maxclients)
                        break;
                }


    Дело в том, что c++ по логике своей однопоточный язык, поэтому при оптимизации он не опирается на то, что другой поток может изменить переменную в цикле. А так как твоя структура arg_s(Лучше конечно названия более осмысленные применять) никак не помечена, то он просто грузит bool переменную в регистр и бесконечно крутится в цикле. Более подробнее можно прочитать здесь .

    Опять же судя по годболту эта проблема и присутствует, но не уверен что у тебя включена оптимизация
    Ответ написан