Задать вопрос
  • Как обеспечить зависимость от проекта другого решения в visual studio?

    @communistic_sistema Автор вопроса
    Илья Голец, у меня в модулях-dll есть классы наследники классов базовой dll. В случае плагинов там действия не связаны с клиентом - нет зависимости от клиента, зависит только от действий клиента.
    В базовой dll есть абстрактный класс basicfunction, который имеет внутри себя поля для описания логики, все остальные импортируемые классы (в модуле-dll) должны быть его наследниками, ибо хранятся как basicfunction* в векторе базовой dll.
    у меня код на С++ (не знаю, зачем убрали тег), а для NET я нахожу только VB, C#, а для С/С++ только упоминание, у вас есть ссылки, где это сделано для С++?
  • Как обеспечить зависимость от проекта другого решения в visual studio?

    @communistic_sistema Автор вопроса
    Илья Голец, есть ехе с зависимостью от dll (назовем ее базовой). Базовая dll дает интерфейс для самого ехе и для dll-модулей.
    У меня решение, где лежит проект ехе, проект базовой dll и проект модуля-dll. В будущем будет больше модулей-dll. То есть в решении будет больше проектов и они буду огромным списком. Плюс хотелось бы разграничить решение модулей от решения ехе+базовая dll от модулей-dll (ибо в модулях уже свои проекты могут добавиться). Если ничего не предпринять будет месево из ехе, базовой dll, dll-модулей и других проектов, нацеленных на работу с dll-модулями.
    CMake это вопрос относительно вашего ответа в пункте о микросервисах.
    slnf я не хотел бы принимать ибо модули могут писаться не мной и в других репозиториях.
  • Как обеспечить зависимость от проекта другого решения в visual studio?

    @communistic_sistema Автор вопроса
    Для каждого проекта придется делать репозиторий? Нельзя ли такое сделать для решения?
    Плюс как избежать копирования проекта в проект при git-submodules (чтобы копировался как проект наравне с существующими)?
    Будет ли CMake хорошим решением для микросервисов?
  • Как обеспечить зависимость от проекта другого решения в visual studio?

    @communistic_sistema Автор вопроса
    что отмерять и что резать?
    возможно ли обойтись без .NET? У меня программа на с++.
  • Как добавить папку в проект dll Visual Studio?

    @communistic_sistema Автор вопроса
    Евгений Шатунов, ссылка, что вы прислали про include имеет пункт 1 - поиск по локальной директории. ../pch.h через локальную папку add выходит в корень проекта, где и лежит pch.h. Так что это не объясняет ошибку.
    Про inline - я не знаю других вариантов решения ODR для переменных, что объявляются в пространстве имен.
  • Как добавить папку в проект dll Visual Studio?

    @communistic_sistema Автор вопроса
    Евгений Шатунов, с ошибкой 2005 разобрался - inline, с ошибкой 1010 - нет. В заголовки никто не учил вставлять, я просто уже от безнадежности повтыкал куда только можно. Имеено папки, а не фильтры.
    Когда заменил ../pch.h на pch.h все заработало, но почему я не понимаю. Ведь заголовка pch.h не существует в папке add.
  • Как добавить папку в проект dll Visual Studio?

    @communistic_sistema Автор вопроса
    Евгений Шатунов, вопрос исправил, привел конкретный код. А сам основной вопрос прямо перед кодом - почему с пакой ошибка 1010 и почему при импорте в пустой файл ошибка 2005
  • Как эффективно хранить неопределенное количество разных типов данных?

    @communistic_sistema Автор вопроса
    Román Mirilaczvili, в итоге у меня система типа
    struct iterator {
      void* data;
    };
    vector<vector<iterator>> memory;

    Я пренебрег дефрагментацией (считая что память будет в основном только выделяться), я пренебрег полностью типами, так что невозможно определить что хранится внутри void*, только создатель должен это знать или функции знакомые с создателем (тип указывается как id), но это вполне достаточно (исключение - классы, любые, они должны быть в итоге уничтожены правильным деструктором, который является частью функции создателя/функции знакомой со создателем).
    Внутренний вектор хранит iteratorы с void* одного size_t (и инициализация идет последовательно, так что сначала инициализируются одни размеры, потом другие, так что это дает некоторые шансы избежать фрагментации при изменении размера с x на y и с y на х, где x > y. Плюс не нужно производить реалокацию, потому что оно заполняется относительно плотно. Также учитывая, что современные компьютеры имеют очень много памяти, фрагментация считается допустимой.
    Плюс у меня контекст создания памяти это ее создание еще до запуска скриптов, ее использующих. Дальнейшие действия с изменением ее объема будут крайне редки.
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Спасибо за ответы и примеры. Это правильные решения. Но я выберу решение Wataru, потому что у меня не возможно отследить является ли shared_ptr единственным на экземпляр данных. Я создам небольшое кол-во классов, которые только они доступны для удаления.
    Проверь этот код. Где в нем утечка и почему в нем не должен вызываться деструктор?
    Предлагаю просто не утверждать того, в чем ты не убедился лично.
    - Евгений Шатунов
    Я не знаю как еще понимать комбинацию
    Деструктор — это функция-член, которая вызывается автоматически при выходе объекта из области действия или явно уничтожена вызовом delete
    от Майкрософт и
    member function may only be called with a pointer to a complete type
    от cppreference в случае деструктора для std::shared_ptr
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Евгений Шатунов, как мне умные указатели помогут в структуре vector<shared_ptr<void>>? Ну может я не настолько хорошо понимаю разницу в утечке памяти и ресурса, но она есть. И то, что если я начну использовать такую конструкцию, не позволит мне избежать утечки.
    Вы мне предлагаете не то, и я поясняю почему это не то. Я говорю - shared_ptr не вызовет деструктор класса. Утечка есть, все плохо.
    У меня нет цели вообще выражать свое мнение по умным указателям, я спрашиваю конкретные способы.
    Если умные указатели могут привести функцию экземпляра (вызывающую деструктор себя) к shared_ptr, то так и скажите, пожалуйста! Это будет прекрасным решением этой проблемы.
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Игорь Кузьмич, я не знаю что за незнакомые слова я тебе говорю.
    Вероятно слово "каст".
    (string*)ptr - это каст. Из void* в string*. Если использовать твою идею то это в каждом dll надо писать функцию с кучей кастов. Например
    switch(type):
    case 0:
      delete (int*)ptr;
      return true;
    default:
      return false;

    и в случае объявления указателя на класс из этого модуля - дать ему указатель на сам класс, тип класса (enum например), указатель на функцию с этим enum.
    но это очень много case, поэтому я спрашиваю, можно ли сделать без этого.
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Игорь Кузьмич, Посмотрел - нельзя.
    void string_destructor(void* ptr)
    {
    delete (string*)ptr;
    }
    . В новом загруженном модуле не string, а class smclss и указатель smclss*. Это можно решить тем, что каст всех указателей идет в модуле, это означает писать кучу кастов в каждом модуле. По-другому нельзя?
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Игорь Кузьмич, variant - хорошее решение при известном числе типов, но опять же, число типов не известно в силу подключения новых модулей. Также я не уверен, что variant вообще позволяет вызывать деструкторы классов.
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Игорь Кузьмич, да, если можно было бы вызвать деструктор по указателю - было бы шикарно, тогда бы void* имел бы void (*f)() в паре и вызывался бы деструктор, а потом free. НО!
    Существует два ограничения на использование деструкторов:
    Вы не можете взять его адрес.
    Производные классы не наследуют деструктор базового класса.

    Питон на самом деле хранит все типы, а нам презентует как неявно типизированную запись.
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Евгений Шатунов,
    Функция-член может быть вызвана только с указателем на полный тип (обратите внимание, что std::unique_ptr может быть создан из необработанного указателя на неполный тип).
    .
    Unlike the std::shared_ptr constructors, std::make_shared does not allow a custom deleter
    .
    Он не сможет удалить класс, если ему дать void. А вот сделать free - да, но это все равно будет утечкой памяти, если указатели класса указывали не на участки выделенной памяти, которая контролируется синглтоном.
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Проблема в том, что в этом векторе может быть указатель на все что угодно, можно лишь пометь общую информацию о содержимом указываемом (класс или нет и т.д.). Так что variant не подходит. Модули (dll) представляют свои классы, так что синглтон работающий с вектором с указателями их не знает, он может принять только самые общие вещи.
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Указатель на деструктор и конструктор не допускаются...
    Я не понимаю почему, если по документации Майкрософт
    это функция-член
    ...

    У меня ситуация такая - модули внешние со своими классами и типами запрашивают место для указателя под свои экземпляры. Чтобы обеспечить высвобождение всех ресурсов при удаления вектора с указателями на разные классы, нужно вызвать деструктор класса, а затем free. Удаление может происходить по запросу кем-либо. Поэтому вектором руководит синглтон, который обеспечивает выдачу и высвобождение памяти. Он располагается в "ядре", которое не знает типы классов модулей (они в dll).
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Wataru, можно ли тогда заменить delete void* на вызов деструктора по указателю как void (*f), то есть хранить 2 указателя, и затем вызывать free?
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Wataru, определение
    void __CRTDECL operator delete(void* _Block, size_t _Size) noexcept;
    . Он берет только мой указатель, ничего более.
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    delete принимает void* в _Block, откуда он берет деструктор и _Size при указании delete (someclass*)pointer?