我正在尝试设置类似于 c# 属性概念的语法糖。
我读过这篇文章:C#-like properties in native c++? . 这很有帮助,但缺乏我想要的设计。我也恭敬地不同意那里提出的几个断言,即属性概念是不好的 oo 形式,因为我看不出一组名为 get_id() 和 set_id() 的方法与暴露相同概念的运算符重载之间的区别,允许在使用类时代码更干净,并且通常不鼓励公共访问私有字段,还将公共实现与私有设计解耦。
但是,我提出的代码(受该链接的启发)确实很笨拙,并且很难维护。我想知道是否有人对清理这个有任何建议,或者更重要的是,知道一个更好的方法来做到这一点。
class someClass
{
public:
struct someProperty_struct{
virtual someProperty_struct& operator=(const int&){return *this;}
virtual operator int(){return 0;}
}someProperty;
};
class derivedClass : someClass
{
int i;
public:
struct intProperty: someClass::someProperty_struct
{
protected:
friend class derivedClass;
derivedClass *outer;
public:
virtual someProperty_struct& operator=(const int& value){
outer->i = value;
return *this;}
virtual operator int(){return outer->i;}
};
derivedClass()
{
intProperty p = intProperty();
p.outer = this;
someProperty = p;
}
};
class consumerClass
{
public:
someClass* data;
consumerClass()
{
data = (someClass*)(new derivedClass());
}
void doSomething()
{
data->someProperty = 7;
int x = data->someProperty;
}
};
编辑1:我突然想到我没有透露任何关于我的意图的信息。它将在调度程序中使用,我们将对类中的所有数据进行大量比较和分配。'someClass' 将有效地成为数据的接口(需要很少的方法,大量的数据应该是相对透明的)。它将在可执行文件将链接的静态库中定义。“derivedClass”实际上是一个外部实现,在动态加载的 dll 中实现。这样做的原因是启用 dll 与另一个实现不同文件后端的 dll 的“热交换”。我们计划使用插件系统来实现 xml、sqlite 和 mysql 存储后端来加载它们。
所以基本上,我需要一个设计,让someClass成为一个由derivedClass继承的虚拟接口,通过工厂方法加载,通过插件系统传递,最终由consumerClass使用。