Ответы пользователя по тегу Visual Studio
  • Как создать глобальный объект для всех элементов проекта?

    @Ariox41
    Вообще, вам стоит почитать про синглтоны в C++, но если лень, самый безопасный вариант - синглтон Майерса:
    #include <string>
    
    // Синглтон Майерса. Переменная str будет создана один раз при первом вызове getPrefix, начиная с c++11 это ещё и потокобезопастно.
    const std::string& getPrefix(){ 
        static std::string str  {"pref::"}; // Инициализация должна быть в конструкторе. 
        return str;
    }
    
    // Его использование.
    std::string addPrefix(const std::string& str){
        return getPrefix() + str; 
    }
    Ответ написан
    Комментировать
  • Как динамически подключать библиотеки?

    @Ariox41
    Посмотрите в сторону boost::DLL

    Позволяет динамически загружать библиотеки, автоматически подсчитывает ссылки на загруженные функции и выгружает библиотеку, когда все ссылки уничтожены (нужно учитывать, что если вы получаете какие-то данные вручную, их нужно уничтожить до того, как будет выгружена библиотека, поскольку библиотека не может подсчитывать ссылки на ваши данные).

    В документации много примеров, особых проблем не должно возникнуть.

    Пример из документации, на всякий случай:
    // my_plugin_api.hpp
    #include <string>
    
    class my_plugin_api {
    public:
       virtual std::string name() const = 0;
       virtual float calculate(float x, float y) = 0;
    
       virtual ~my_plugin_api() {}
    };

    Реализация плагина:
    // my_plugin_sum.cpp
    #include <boost/config.hpp> // for BOOST_SYMBOL_EXPORT
    #include "../tutorial_common/my_plugin_api.hpp"
    
    namespace my_namespace {
    
    class my_plugin_sum : public my_plugin_api {
    public:
        my_plugin_sum() {
            std::cout << "Constructing my_plugin_sum" << std::endl;
        }
    
        std::string name() const {
            return "sum";
        }
    
        float calculate(float x, float y) {
            return x + y;
        }
    
        ~my_plugin_sum() {
            std::cout << "Destructing my_plugin_sum ;o)" << std::endl;
        }
    };
    
    // Exporting `my_namespace::plugin` variable with alias name `plugin`
    // (Has the same effect as `BOOST_DLL_ALIAS(my_namespace::plugin, plugin)`)
    extern "C" BOOST_SYMBOL_EXPORT my_plugin_sum plugin;
    my_plugin_sum plugin;
    
    } // namespace my_namespace

    Собственно, загрузка библиотеки:
    #include <boost/dll/import.hpp> // for import_alias
    #include <iostream>
    #include "../tutorial_common/my_plugin_api.hpp"
    
    namespace dll = boost::dll;
    
    int main(int argc, char* argv[]) {
    
        boost::filesystem::path lib_path(argv[1]);          // argv[1] contains path to directory with our plugin library
        boost::shared_ptr<my_plugin_api> plugin;            // variable to hold a pointer to plugin variable
        std::cout << "Loading the plugin" << std::endl;
    
        plugin = dll::import<my_plugin_api>(          // type of imported symbol is located between `<` and `>`
            lib_path / "my_plugin_sum",                     // path to the library and library name
            "plugin",                                       // name of the symbol to import
            dll::load_mode::append_decorations              // makes `libmy_plugin_sum.so` or `my_plugin_sum.dll` from `my_plugin_sum`
        );
    
        std::cout << "plugin->calculate(1.5, 1.5) call:  " << plugin->calculate(1.5, 1.5) << std::endl;
    }

    Вывод:
    Loading the plugin
    Constructing my_plugin_sum
    plugin->calculate(1.5, 1.5) call:  3
    Destructing my_plugin_sum ;o)
    Ответ написан
    Комментировать
  • Проблемы с компиляцией в visual studio 2015, после адаптации с visual studio 2010. Что делать?

    @Ariox41
    std::array создается на стеке как обычный сишный массив и требует указания размера во время компиляции, примерно так: std::array<int, 3> array = {1, 2, 3};

    Edit: Возможно, там нужен не std::array, а что-то другое, но где-то использован using namespace std
    Edit: Не сразу въехал во вторую часть. Шаблонный параметр должен быть известен во время компиляции, т.е. bmp->Width должен быть constexpr или statc constexpr с соответствующим синтаксисом обращения. Динамические массивы в С++ - это std::vector, у вас скорее всего использовался array из CLI, но в CLI я не разбираюсь.
    Ответ написан
    1 комментарий