Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.17.110.58] |
|
Сообщ.
#1
,
|
|
|
Я перехожу с Delphi. Многое там строится на виртуальных конструкторах, как без этого обойтись или обойти?
Как, например, передать в функцию класс, но не его экземпляр, а в функции создать несколько экземпляров данного класса? Есть ли классовые функции (то есть такие, которые вызываются без создания объекта)? Есть ли классовые переменные? (То есть куда можно поместить класс или ссылку на класс). |
Сообщ.
#2
,
|
|
|
То, о чем ты спрашиваешь называется фабрикой классов. В C++ (в отличии от делфей) классы не являются runtime-сущностями. Но эту проблему можно обойти. Для класса можно определить т. н. статические методы и члены данных. Для работы с такими методами и данными экземпляров класса не нужно. По этому можно, например, сделать так:
class A : public Base { public: static Base* Create(); }; class B : public Base { public: static Base* Create(); }; class C : public Base { public: static Base* Create(); }; Base* CreateObject(Base* (*creationFun)()) { Base* obj = (*creationFun)(); return obj; } void SomeFunc() { // Создаем экземпляр класса A CreateObject(&A::Create); // Создаем экземпляр класса B CreateObject(&B::Create); // Создаем экземпляр класса C CreateObject(&C::Create); } |
Сообщ.
#3
,
|
|
|
Цитата vavR, 18.02.04, 13:21 Как, например, передать в функцию класс, но не его экземпляр class MyClass{ }; void func( const MyClass &mc ); ... MyClass mc; func( mc ); Цитата vavR, 18.02.04, 13:21 а в функции создать несколько экземпляров данного класса? void func( const MyClass &mc ){ MyClass mc1; MyClass mc2; MyClass mc3; } Цитата vavR, 18.02.04, 13:21 Есть ли классовые функции (то есть такие, которые вызываются без создания объекта)? class MyClass{ public: [B]static[/B] void somefunc(); } ... MyClass::somefunc(); Цитата vavR, 18.02.04, 13:21 Есть ли классовые переменные? (То есть куда можно поместить класс или ссылку на класс). class MyClass{ public: MyClass *any; // указатель на клас } ... MyClass mc1; MyClass mc2; mc1.any = &mc2; |
Сообщ.
#4
,
|
|
|
Цитата Lucifer, 18.02.04, 13:22 про указатели слышал? Про Delphi'йские ссылки на класс слышал? Цитата Sazabis, 18.02.04, 19:37 Цитата vavR, 18.02.04, 13:21 Как, например, передать в функцию класс, но не его экземпляр class MyClass{ }; void func( const MyClass &mc ); ... MyClass mc; func( mc ); Здесь имеется ввиду, как передать тип класса. Цитата Цитата vavR, 18.02.04, 13:21 а в функции создать несколько экземпляров данного класса? void func( const MyClass &mc ){ MyClass mc1; MyClass mc2; MyClass mc3; } А если mc ссылается на производный от MyClass класс? Цитата vavR, 18.02.04, 13:21 Посмотри, как в C++ Builder'е сделано. Там в качестве ссылки на класс выступает объект служебного класса, CMetaClass, по-моему. Вариант Flex_Ferrum можно преобразовать к подобному виду, если специфическую функциональность вынести в служебный класс. Например: class CMetaClass { public: virtual Base *Create() const; }; template<class T> CMeta: public CMetaClass { Base *Create() const { return new T(); } }; Base *CreationFun(CMetaClass const &r) { return r.Create(); } class CMy: public Base { ... }; class CMy2: public Base { ... }; ... /* ссылка на класс CMy */ CMeta<CMy> MyClassRef; Base *p(CreationFun(MyClassRef)); /* Если нужна переприсваимаемая переменная со смыслом "ссылка на класс" */ CMetaClass *pClassRef(&MyClassRef); CMeta<CMy2> My2ClassRef; pClassRef = &My2ClassRef; Base *p2(CreationFun(*pClassRef)); Edward. |