Примечание: я не имею в виду указатель на ОБЪЕКТ или МОМЕНТ, я имею в виду указатель на КЛАСС
Я ставлю это сверху, потому что я знаю, если я не люди скажет мне, что я могу сделать
class MyClass;
MyClass* pointerToMyClass = new MyClass(); // Ta-da! pointer to class!
Это не то, что я ищу. Я хотел бы сделать указатель на сам тип класса, что-то вроде указателя на функцию, но для класса.
Чтобы пояснить, о чем я спрашиваю, приведу код, который примерно демонстрирует, что я ищу.
class MyClass; // real Class
class MyDerived : public MyClass; // derived class
class * ClassPointer = &MyClass; // pointer to my class
MyClass * instanceOfPointer = new ClassPointer(); // now makes an instance of MyClass
ClassPointer = &MyDerived; // pointer to derived class
MyClass * instance2 = new ClassPointer(); // now makes an instance of DerivedClass
Так что вроде как typedef, но более динамичный c.
Я также хотел бы иметь возможность создать вектор указателей классов. В настоящее время я взламываю нужное мне поведение с помощью функции класса clone()
, которая возвращает новый указатель на базовый класс, но мне не особенно нравится этот подход.
Возможно ли что-либо подобное в C ++?
Редактировать: текущая проблема, для которой я использую это, - сетевой протокол polymorphi c. Существует базовый класс пакета:
class packet{
int id=0;
virtual packet* read(); // read packet type into id
virtual packet* clone(){ return new packet(); }
};
, затем несколько производных пакетов:
class packet1 : public packet{
int id=1
packet* read(); // do packet specific reading
packet * clone(){ return new packet1(); }
};
class packet2 : public packet{
int id=2
packet* read(); // do packet specific reading
packet * clone(){ return new packet21(); }
};
class packet3 : public packet{
int id=3
packet* read(); // do packet specific reading
packet * clone(){ return new packet3(); }
};
, а затем для чтения пакета все, что вам нужно сделать, это
packet* array[] = { new packet(), new packet1(), new packet2(), new packet3() }; // array of packets, this should be class* if possible
packet type = packet();
type.read(); // read type from network
packet* data = array[type.id].clone(); // pick derived class based on type
data->read(); // read specific packet from network
packet*[]
будет заменен на class*[]
, чтобы избежать необходимости использовать clone()
.
Это упрощенный, но выполнимый пример.