我的使用非常复杂。我有一堆 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/