На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Как жить без виртуальных конструкторов? , Подскажите аналог или замену.
    Я перехожу с Delphi. Многое там строится на виртуальных конструкторах, как без этого обойтись или обойти?
    Как, например, передать в функцию класс, но не его экземпляр, а в функции создать несколько экземпляров данного класса?
    Есть ли классовые функции (то есть такие, которые вызываются без создания объекта)?
    Есть ли классовые переменные? (То есть куда можно поместить класс или ссылку на класс).
      То, о чем ты спрашиваешь называется фабрикой классов. В C++ (в отличии от делфей) классы не являются runtime-сущностями. Но эту проблему можно обойти. Для класса можно определить т. н. статические методы и члены данных. Для работы с такими методами и данными экземпляров класса не нужно. По этому можно, например, сделать так:
      ExpandedWrap disabled
         
        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);
        }
        Цитата
        vavR, 18.02.04, 13:21
        Как, например, передать в функцию класс, но не его экземпляр

        ExpandedWrap disabled
          class MyClass{  };
          void func( const MyClass &mc );
          ...
           
          MyClass mc;
          func( mc );

        Цитата
        vavR, 18.02.04, 13:21
        а в функции создать несколько экземпляров данного класса?

        ExpandedWrap disabled
          void func( const MyClass &mc ){
            MyClass mc1;
            MyClass mc2;
            MyClass mc3;
          }

        Цитата
        vavR, 18.02.04, 13:21
        Есть ли классовые функции (то есть такие, которые вызываются без создания объекта)?

        ExpandedWrap disabled
          class MyClass{
            public:
             [B]static[/B] void somefunc();
          }
           
          ...
           
          MyClass::somefunc();

        Цитата
        vavR, 18.02.04, 13:21
        Есть ли классовые переменные? (То есть куда можно поместить класс или ссылку на класс).

        ExpandedWrap disabled
          class MyClass{
            public:
              MyClass *any; // указатель на клас
          }
           
          ...
           
          MyClass mc1;
          MyClass mc2;
          mc1.any = &mc2;
          Цитата
          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.
          1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0217 ]   [ 15 queries used ]   [ Generated: 21.05.24, 23:36 GMT ]