Ответы пользователя по тегу C++
  • Проблема с деструктором при использовании конструктора копирования?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Тут есть ещё более глобальная проблема, чем просто не выделение памяти в конструкторе копирования: использование char*. Вы же пишете на C++, а не на C с классами. Используйте std::string для sea_name. Вы увидите, насколько проще, короче и безопаснее станет ваш код.
    Ответ написан
    3 комментария
  • В чем ошибка (работа с памятью, деструкторы)?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    У вас же C++, т.е. можете использовать вектор для хранения элементов без необходимости явного выделения памяти:
    #include <vector>
    
    // double* _coords;
    std::vector<double> _coords;
    
    // _coords = new double[N];
    _coords.resize(N);

    Ну и деструктор можете не писать.
    Ответ написан
    Комментировать
  • Почему не получается записать в поле структуры переменную типа string?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Потому что поле Info представляет из себя массив строк, а не одну строку. Т.е. вы по факту пытаетесь записать значение переменной одного типа в переменную другого типа. Допустим такой код уже должен скомпилироваться:
    t->Info[0] = Inf;
    Это означает: присвоить первому элементу массива Info значение переменной Inf. Правда я не уверен этого ли вы хотите. Возможно вам нужно просто сделать переменную Info обычной строкой, а не массивом и тогда ваш код тоже будет работать.
    Ответ написан
    Комментировать
  • Как удалить элементы в Layout и сам Layout?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Ну layout не обязательно родитель элемента, который в него добавили.
    Вы можете получить любой объект, который видно в дизайнере, через указатель ui. Например, ui->tab_4...
    Ответ написан
    Комментировать
  • Как парсить html страничку на с++?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Что у вас конкретно не получается? Вроде бы в документации есть всё:
    1) Установка
    2) Пример использования
    Ответ написан
    Комментировать
  • Правильный ли результат?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Всё правильно. Это называется экспоненциальная запись.

    Если вам не нравится такой формат вывода, то можете использовать std::fixed:
    std::cout << "Result: " << std::fixed << res;

    Предугадывая следующий вопрос, точность можно регулировать с помощью std::setprecision(n).
    Ответ написан
    Комментировать
  • Не пойму в чём ошибка в коде?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    А пробовали ли вы свой код отлаживать?
    Поставьте брейк поинт на ту логику, которая должна вызываться. Посмотрите, тригеринтся ли он. Если нет, разберитесь почему. Если да, то смотрите почему логика не работает. Ну и по шагам программу отлаживайте.

    Это не какой-то общий вопрос у вас. Это частный случай, который просто надо отлаживать. Не уверен, что кто-то хочет делать это за вас.
    Ответ написан
    4 комментария
  • Изучение C++ учебник/курс?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    А это в большей степени индивидуально. Пользуйтесь тем, что больше нравится.
    Книги или курсы дают базу. Чтобы хорошо научиться пользоваться инструментом, нужно его применять на практике. Работать над своим проектом одному, а лучше в группе, или присоединиться к открытому проекту -- это отличный вариант для изучения зыков программирования и разработки ПО в целом.
    Ответ написан
    Комментировать
  • Стоит ли переходить на std:: или же лучше остаться на using namespace std?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Основная проблема -- это возможные конфликты имён, в особенности, если вы прописываете использование нескольких пространств имён таким образом. Помимо этого, есть риск получить очень много вариантов различных конструкций в списке автодополнения IDE. Сам по себе std -- это очень короткий идентификатор, поэтому опускать его нет особого смысла.

    PS
    Ко всему прочему, никогда не пишите "using namespace" в заголовочных файлах. За исключением случаев, когда вы действительно понимаете что делаете.
    Ответ написан
    Комментировать
  • Почему из функции возвращается временный объект?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Там будет не временный объект, а тот же самый объект, что вы создали внутри функции. Даже копирования не будет. Хотя, у вас тут объект срезаться может поэтому ещё вопрос. Почитайте про RVO/NRVO.
    Я немного поправил ваше решение:
    Foo get_foo(const char *msg)
    {
        return Foo_2(msg);
    }

    Так будет лучше.

    Но! Тут важно понимать, что делать так в реальном коде нельзя, т.к. объект класса Foo_2, при некоторых условиях, срежется до объекта класса Foo. В вашем случае -- это не проблема. Но можно переписать как-то так, например:
    const Foo &get_foo(const char *msg)
    {
        static Foo_2 foo2(msg);
        return foo2;
    }

    Этот код тоже не для всех случаев подходит, т.к. get_foo будет возвращать всегда один и тот же объект с одним и тем же сообщением.
    Ответ написан
    5 комментариев
  • Где в linux искать библиотеки для GCC?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Можно установить утилиту locate, и искать всё что вашей душе угодно. Можно посмотреть в пакетном менеджере куда и что устанавливается. Но обычно, компилятор видит библиотеки, установленные по дефолту (в места по-умолчанию), вам надо только -l и имя библиотеки добавить во флаги линкера.
    Ответ написан
    Комментировать
  • Почему возникает ошибка линковки в данном случае?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Посмотрите, какой Makefile генерирует qmake. Там могут быть добавлены лишние пути или флаги из spec файла.
    Проверьте, используется ли реально при компиляции и линковке g++, а не, скажем gcc (это можно посмотреть в окне Compile output).
    Проверьте, включён ли файл cstring везде, где это нужно.
    Ответ написан
  • Почему при использовании шаблонов классов выдает ошибку "неразрешенный внешний символ"?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Потому что шаблоны должны быть объявлены и определены в заголовочном файле (по стандарту языка). Перенесите всё из cpp в h и у вас всё заработает.
    Ответ написан
    7 комментариев
  • Как выполнить одну функцию для всех элементов вектора одновременно?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Вам уже написали выше, как это реализовать с помощью стандартной библиотеки (правда пока это ещё не часть стандарта, насколько мне известно).
    В вашем случае, алгоритм будет такой:
    1) Узнать число доступных потоков https://en.cppreference.com/w/cpp/thread/thread/ha...
    2) Развить массив на столько частей, сколько у вас есть потоков
    3) Написать функцию, которая принимает, скажем два итератора на часть массива, которую необходимо обработать, и два итератора на массив с результатами
    4) Создать необходимое количество потоков https://en.cppreference.com/w/cpp/thread/thread/thread (число было получено в пункте 1) и запустить в них функции.
    5) Дождаться результатов завершения: https://en.cppreference.com/w/cpp/thread/thread/join

    Для этого можно использовать и std::async (https://en.cppreference.com/w/cpp/thread/async). Он возвращает std::future (https://en.cppreference.com/w/cpp/thread/future), на этом объекте необходимо будет ждать результатов вычисления.

    Хотелось бы ещё отметить, что возможно не имеет смысла параллелить обработку небольших массивов, это только замедлит программу.
    Ответ написан
    Комментировать
  • Как правильно определить атрибуты при наследовании (c++, ООП)?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Можно сделать например так:
    #include <iostream>
    #include <iomanip>
    #include <memory>
    
    class ISomeInterface
    {
    public:
    	virtual bool isFoo() const noexcept = 0;
    };
    
    class Foo : public ISomeInterface
    {
    public: 
    	bool isFoo() const noexcept override { return true; }
    };
    
    class Bar : public ISomeInterface
    {
    public: 
    	bool isFoo() const noexcept override { return false; }
    };
    
    int main()
    {
    	// Or shared_ptr/make_shared
    	std::unique_ptr<ISomeInterface> foo = std::make_unique<Foo>();
    	std::cout << "Foo is Foo: " << std::boolalpha << foo->isFoo() << std::endl;
    	
    	// Or shared_ptr/make_shared
    	std::unique_ptr<ISomeInterface> bar = std::make_unique<Bar>();
    	std::cout << "Bar is Foo: " << std::boolalpha << bar->isFoo() << std::endl;
    	
    	return 0;
    }

    Ну и в методах не обязательно возвращать просто true/false, там может быть любая другая переменная.
    Ответ написан
  • Как правильно переопределить функции и типы при наследовании класса?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Да, это можно сделать, но вам необходимо использовать шаблоны. Что-то вроде:
    #include <stdio.h>
    #include <iostream>
    #include <typeinfo>
    
    template <class T>
    class A {
    public:
        A(){};
        ~A(){};
        
        typedef T custom;
        
        custom num = 1;
        
        T get() {
            return num;
        }
        void print() {
            std::cout << get() << " " << typeid(num).name() << "\n";
        }
    };
    
    class B : public A<float> {
    public:
        B() : A() { num = 2.f; };
        ~B(){};
    };
    
    int main() {
        B b;
        b.print();
    
        return 0;
    }


    PS
    Я просто немного поправил код автора...
    Ответ написан
    Комментировать
  • Как удалить элемент из вектора без вызова деструктора (с++)?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Можно хранить умные указатели на объекты. А можно хранить и reference_wrapper. Но это уже от архитектуры зависит.
    Ответ написан
    Комментировать
  • Автоматизация постов в OK?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Есть REST API: https://apiok.ru/
    Кратко, посылаете запросы, получаете ответ. На основании него что-то делаете.
    БД с постами для публикации может быть где угодно и любая.
    Ответ написан
    4 комментария
  • Выгода по времени и по памяти в реальной работе?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Важно и то и другое. Я правда не уверен, что проверяющие ЕГЭ что-то в этом понимают. Но может для учебных задачек у них есть какие-то заготовленные решения, с которыми ваше должно примерно совпасть. Так что тут я с вами согласен, подогнать программу под шаблонное решение может быть трудновато.

    PS
    На самом деле, ЕГЭ вам ничего не даёт и не прививает, вы просто тратите год жизни на то, чтобы ваша школа получила высокие формальные показатели. Этакое натаскивание на однотипные вещи, которое в перспективе бесполезно. Разве что в ВУЗ хороший поступить получится.
    Ответ написан
  • Как правильно отправить в поток функцию?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Чисто на всякий случай, оставлю этот код тут. Как я понимаю, это то, что вы хотите получить: функция в отдельном потоке, без блокировки GUI + вам нужно дождаться результатов выполнения.
    QEventLoop loop;
    QFutureWatcher watcher = QConcurrent::run(someFunc);
    connect(&watcher, &QFutureWatcher::finished,  &loop, &QEventLoop::quit);
    loop.exec();
    auto result = watcher.result();

    Если результат выполнения не нужен, то функцию можно просто асинхронно запустить одним методом run.
    Ответ написан
    Комментировать