c++ - C++ 中类似属性的特性?

标签 c++

我的使用非常复杂。我有一堆 objs,它们都是通过 ptr 传递的(不是引用或值,除非它是 byval 的枚举)。在特定的时间点,我喜欢调用 CheckMembers() ,它将检查每个成员是否已设置或为空。默认情况下,我不能将它全部设置为 null,因为我不知道我是否将它设置为 null 或者它是否仍然为 null,因为自从 ctor 以来我就没有碰过它。

要分配一个变量,我仍然需要语法是正常的 var = p; var->member = new Type;.我生成所有类/成员。所以我的问题是如何实现类似功能的属性,我可以在其中检测该值是否已设置或保留为默认值?

我在想也许我可以将 C++ 与 CLR/.NET 一起使用 http://msdn.microsoft.com/en-us/library/z974bes2.aspx但我以前从未使用过它,也不知道它的工作效果如何以及我的 C++ prj 中可能会出现什么问题(它使用 rtti、模板等)。

最佳答案

现实(编辑):事实证明这很棘手,但以下代码应该可以满足您的要求。它在基类中使用一个简单的计数器。计数器为您希望跟踪的每个属性增加一次,然后为每个设置的属性减少一次。 checkMembers() 函数只需验证计数器是否为零。作为奖励,您可能会报告有多少成员未初始化。

#include <iostream>

using namespace std;

class PropertyBase
{
    public:
        int * counter;
        bool is_set;
};

template <typename T>
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<OtherObject> x;
        Property<OtherObject> 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;
}

关于c++ - C++ 中类似属性的特性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6079052/

相关文章:

c++ - 设置 Qt QPushButton 弹出菜单的位置(向右)

c++ - int8_t、int16_t、int32_t 和 int64_t 在不同的 C++ 编译器上是否具有相同的各自范围?

c++ - 使用 VS2010 在客户端编译 native COM 客户端 stub

c++ - 为什么使用默认构造函数构造的对象的 `sizeof` 总是得到 1?

c++ - CRTP 静态多态性 : Using the Base Class to Call Derived Methods

c++ - 迁移到 C++11 时出现不等式比较结果未使用警告

c++ - 我在计算带有静态变量的对象总数的程序中出错

c++ - 我可以在其中存储数据的地方/C++,Linux,QtCreator

c++ - 迭代 C++ std::map 的正确方法不起作用

C++ 部分模板特化 - 设计简化