Вопрос

У меня есть несколько классов, которые все являются производными от базового класса, теперь некоторые из производных классов не будут компилироваться в зависимости от платформы.У меня есть класс, который позволяет мне возвращать объект базового класса, однако теперь все имена производных классов были жестко запрограммированы.

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

Это было полезно?

Решение

Вы ищете регистрацию класса среды выполнения C ++?Я нашел это Ссылка (резервное копирование).

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

Другие советы

Я не знаю, чего вы на самом деле пытаетесь достичь, но вы могли бы поместить одноэлементный конструктор в файл реализации каждого производного класса, который добавляет имя в список вместе с указателем на фабрику.Тогда список всегда актуален и может создавать все скомпилированные в нем классы.

Как правило, полагаться на информацию о типе во время выполнения - плохая идея в C ++.То, что вы описали, похоже на заводской шаблон.Возможно, вы захотите рассмотреть возможность создания специального подкласса factory для каждой платформы, который знал бы только о классах, существующих на этой платформе.

Похоже, это подходящее место для использования "полиморфизма во время компиляции" или параметров политики шаблона.

Посмотрите современный дизайн C ++ Андрея Александреску и его Локи реализация основана на книге.Смотрите также Локи страница в википедии.

Существуют неприятные, специфичные для компилятора приемы для получения информации о классе во время выполнения.Поверь мне, тебе не захочется открывать эту банку с червями.

Мне кажется, что единственным серьезным способом сделать это было бы использовать условную компиляцию для каждого из производных классов.В блоке #ifdef определите новое константа, содержащая имя класса, который компилируется.Затем имена по-прежнему жестко закодированы, но все они находятся в центральном месте.

Имена производных классов должны быть жестко запрограммированы на C ++.Другого способа их использовать нет.Следовательно, не только нет способа автоматически определить, какие классы были скомпилированы, но и не было бы способа использовать эту информацию, если бы она существовала.

Если бы вы могли указывать классы во время выполнения на основе их имени, что-то вроде:

std::строка foo = "Производный 1";Базовый * объект = новый "foo";// или любая другая нотация, которая вам нравится - не работает в C ++

тогда была бы полезна возможность определить, был ли "Derived1" скомпилирован или нет.Поскольку вы должны указать класс напрямую, например:

Базовый * объект = новый производный 1;// работает ли на C ++

вся проверка выполняется во время компиляции.

Если у каждого класса есть своя собственная динамическая библиотека, просто проверьте, существует ли эта библиотека.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top