Знание классов среды выполнения С++

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

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

Ответ 1

Вы ищете регистрацию классов выполнения С++? Я нашел эту ссылку: http://meat.net/2006/03/cpp-runtime-class-registration/

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

Ответ 2

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

Ответ 3

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

Ответ 4

Это звучит как место для использования "полиморфизма времени компиляции" или параметров политики шаблона.

См. Modern С++ Design от Andrei Alexandrescu и его Loki на основе книги. См. Также страницу Loki в википедии.

Ответ 5

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

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

Ответ 6

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

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

std::string foo = "Derived1"; Base * object = new "foo";//или любое другое обозначение, которое вам нравится - не работает в С++

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

Base * object = new Derived1;//работает в С++

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

Ответ 7

Если каждый класс имеет свою собственную динамическую библиотеку, просто проверьте, существует ли библиотека.