Ответы пользователя по тегу C++
  • Умные указатели?

    Есть задачи, которые не имеют решения на ссылках (либо это решение в разы хуже, чем если бы мы использовали указатели).
    Пример: паттерн стратегия
    #include <iostream>
    #include <memory>
    
    class Strategy {
    public:
        virtual void doAction() = 0;
    };
    
    class FirstStrategy : public Strategy{
    public:
        void doAction() override {
            std::cout << "First" << std::endl;
        }
    };
    
    class SecondStrategy : public Strategy{
    public:
        void doAction() override {
            std::cout << "Second" << std::endl;
        }
    };
    
    class A {
        std::shared_ptr<Strategy> behavior;
    
    public:
        void setBehavior(std::shared_ptr<Strategy> b) {
            behavior = b;
        }
    
        void doBehavior() {
            behavior->doAction();
        }
    
    };
    
    int main() {
        A a;
        a.setBehavior(std::make_shared<FirstStrategy>());
        a.doBehavior();
    
        a.setBehavior(std::make_shared<SecondStrategy>());
        a.doBehavior();
        return 0;
    }


    Во время исполнения стратегия может меняться. Так как ссылку изменить нельзя, придется создавать какие-то костыли. С указателями все проще: просто обновляем значение переменной
    Ответ написан
    Комментировать
  • Магия конструкторов?

    Компилятор не делаем больше одного преобразования
    Если заменить на Example two=std::string("line");, то все заработает
    Example two=std::string("line");  ->  Example two(std::string("line")); //подходит конструктор Example ( const std::string &line )

    Example two="line";  ->  Example two("line"); //Нет конструктора, который принимает const char*
    Ответ написан
    Комментировать
  • Как переставить элементы в двумерном массиве?

    Если массив на стеке, то подойдет такой способ:
    const int n  = 5;
        int arr[3][3] = {0, 1, 2, 5, 8, 3, 4, 4, 2};
        int *ptr = reinterpret_cast<int *>(arr);
    
        for(int i = 0, c = (n + 1) / 2; i < c; ++i) {
            int tmp = ptr[i];
            ptr[i] = ptr[n - i];
            ptr[n - i] = tmp;
        }
    Ответ написан
    Комментировать