Я хочу передать тип в качестве параметра (не переменная или ссылка).
У меня есть этот рабочий код:
код выполнения, где «testState2» — это имя класса (т.е. тип в данном случае). Заметка у него есть базовый тип state_t:
changeState(new testState2());
функция изменения состояния:
void state_t::changeState(state_t * new_state)
{
// Check if the state has changed
if (this != new_state)
{
qDebug() << this->name << ": State changed to: " << new_state->name;
delete this;
_state = new_state;
}
else
{
qDebug() << this->name << ": State un-changed";
}
}
В этом коде я в основном создаю новый экземпляр testState2, но я хочу еще больше упростить вызывающий код. Я хочу просто передать тип, как это:
changeState(testState2);
Примечание: «new» не существует, и это не создание экземпляра, просто передача имени класса, поэтому:
Классы (и типы в целом) в C ++ не являются первоклассными значениями и поэтому не могут быть переданы или сохранены.
Для занятий вы можете теоретически использовать typeid
но чаще всего мне показалось более полезным просто иметь строки, возвращаемые виртуальной функцией в экземплярах, и реестр для реализации шаблона «виртуального конструктора».
struct Base
{
virtual const char *class_name() = 0;
...
};
struct MyClass : public(Base)
{
virtual const char *class_name() { return "MyClass"; }
...
}
std::map<std::string, Base *(*)()> instance_builders;
Для изучения модели состояния, пример на
State Design Pattern в C ++ может быть хорошей отправной точкой.