Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Apr 12, 2015, 11:07:14 PM (9 years ago)
Author:
landauf
Message:

use static identifier initializer to store the inheritance definition of abstract classes. this prevents that identifiers are used (via Class(Name)) before they are properly initialized.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/core7/src/libraries/core/CoreIncludes.h

    r10360 r10362  
    127127*/
    128128#define RegisterClassWithFactory(ClassName, FactoryInstance, bLoadable) \
    129     Identifier& _##ClassName##Identifier = (new orxonox::SI_I(orxonox::registerClass<ClassName>(#ClassName, FactoryInstance, bLoadable)))->getIdentifier()
     129    orxonox::SI_I& _##ClassName##Identifier = (*new orxonox::SI_I(orxonox::registerClass<ClassName>(#ClassName, FactoryInstance, bLoadable)))
    130130
    131131/**
     
    213213    }
    214214
     215
     216
     217
     218    /**
     219     * The static initializer stores the parent classes of this identifier. The corresponding identifiers are later loaded. This prevents identifiers from
     220     * being used before they are completely initialized.
     221     */
    215222    class _CoreExport StaticallyInitializedIdentifier : public StaticallyInitializedInstance
    216223    {
     224        struct InheritsFrom
     225        {
     226            virtual ~InheritsFrom() {}
     227            virtual Identifier* getParent() = 0;
     228        };
     229
     230        template <class T>
     231        struct InheritsFromClass : public InheritsFrom
     232        {
     233            virtual Identifier* getParent() { return Class(T); }
     234        };
     235
    217236        public:
    218237            StaticallyInitializedIdentifier(Identifier* identifier) : identifier_(identifier) {}
    219 
    220             virtual void load() {}
     238            ~StaticallyInitializedIdentifier()
     239            {
     240                for (size_t i = 0; i < this->parents_.size(); ++i)
     241                    delete parents_[i];
     242            }
     243
     244            virtual void load()
     245            {
     246                for (size_t i = 0; i < this->parents_.size(); ++i)
     247                    this->identifier_->inheritsFrom(this->parents_[i]->getParent());
     248            }
    221249
    222250            inline Identifier& getIdentifier()
    223251                { return *this->identifier_; }
    224252
     253            template <class T>
     254            inline StaticallyInitializedIdentifier& inheritsFrom()
     255                { this->parents_.push_back(new InheritsFromClass<T>()); return *this; }
     256
    225257        private:
    226258            Identifier* identifier_;
     259            std::vector<InheritsFrom*> parents_;
    227260    };
    228261
Note: See TracChangeset for help on using the changeset viewer.