Знание C ++ во время выполнения классов - PullRequest
2 голосов
/ 17 сентября 2008

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

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

Ответы [ 7 ]

3 голосов
/ 17 сентября 2008

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

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

2 голосов
/ 17 сентября 2008

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

1 голос
/ 17 сентября 2008

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

0 голосов
/ 17 сентября 2008

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

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

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

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

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

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

0 голосов
/ 17 сентября 2008

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

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

0 голосов
/ 17 сентября 2008

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

См. Modern C ++ Design Андрея Александреску и его Loki реализацию, основанную на книге. См. Также страницу Локи в Википедии.

0 голосов
/ 17 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...