Property like features in C++?

后端 未结 3 1557
孤城傲影
孤城傲影 2020-12-16 08:59

My use is pretty complicated. I have a bunch of objs and they are all passed around by ptr (not reference or value unless its an enum which is byval). At a specific point in

3条回答
  •  -上瘾入骨i
    2020-12-16 09:01

    Reality (edit): this proved to be tricky, but the following code should handle your requirements. It uses a simple counter in the base class. The counter is incremented once for every property you wish to track, and then decremented once for every property that is set. The checkMembers() function only has to verify that the counter is equal to zero. As a bonus, you could potentially report how many members were not initialized.

    #include 
    
    using namespace std;
    
    class PropertyBase
    {
        public:
            int * counter;
            bool is_set;
    };
    
    template 
    class Property : public PropertyBase
    {
        public:
            T* ptr;
            T* operator=(T* src)
            {
                ptr = src;
                if (!is_set) { (*counter)--; is_set = true; }
                return ptr;
            }
            T* operator->() { return ptr; }
            ~Property() { delete ptr; }
    };
    
    class Base
    {
        private:
            int counter;
        protected:
            void TrackProperty(PropertyBase& p)
            {
                p.counter = &counter;
                counter++;
            }
        public:
            bool checkMembers() { return (counter == 0); }
    };
    
    class OtherObject : public Base { }; // just as an example
    
    class MyObject : public Base
    {
        public:
            Property x;
            Property y;
            MyObject();
    };
    
    MyObject::MyObject()
    {
        TrackProperty(x);
        TrackProperty(y);
    }
    
    int main(int argc, char * argv[])
    {
        MyObject * object1 = new MyObject();
        MyObject * object2 = new MyObject();
    
        object1->x = new OtherObject();
        object1->y = new OtherObject();
    
        cout << object1->checkMembers() << endl; // true
        cout << object2->checkMembers() << endl; // false
    
        delete object1;
        delete object2;
    
        return 0;
    }
    

提交回复
热议问题