【发布时间】:2016-04-22 16:22:57
【问题描述】:
我正在处理一个大型代码库,并且有许多公开定义的变量。不幸的是,访问这些变量的功能已经改变,这个新功能最好由公共访问器和私有实例变量封装。
所以,我正在尝试进行此更改。为此,我计划将每个公共属性设为私有,然后创建访问器。但是,我不想更改任何访问旧公共属性的代码。例如:
将公共属性更改为私有后,我有以下类:
class Test {
private:
int item = 5;
public:
int GetItem() {
return item;
};
void SetItem(int new_item) {
item = new_item;
};
};
过去,“item”是类的公共属性,通过以下方式访问:
Test* t = new Test();
int item = t->item;
现在,我需要为检索“项目”的方式添加新功能。例如:
int GetItem() {
// Some complicated code which changes "item"
return item;
};
我怎样才能保持相同的语法:
int item = t->item;
但是让这个实际执行:
int item = t->GetItem();
非常感谢任何帮助!
【问题讨论】:
-
不,C++ 是一种已编译的非反射性语言,也就是说,您不能只是“在访问元素时查找名称”,因为在二进制文件中,不再有名称。另外,请不要仅仅为了拥有 getter 和 setter 就让你的 C++ 变成 Java——如果它们实际上没有增加安全性,我真的看不出使用它们的意义。
-
@MarcusMüller 如果它们存在,属性将不需要任何反射或运行时支持。它们可能纯粹是编译器扩展的方法调用的语法糖。当然,它们不存在,但不是因为你暗示的原因。
-
通过 getter 和 setter 进行封装是有原因的,如果没有这个原因,你不需要仅仅为了封装而需要 getter 和 setter
-
“它是通过以下方式访问的:
Test t = new Test();” 我对此表示怀疑。那甚至不会编译。 -
@delnan 如果它们存在,那么这些语法糖属性会导致悖论——该属性的地址是什么?它的类型是什么?不,对于严格静态类型的语言,拥有这样的属性会带来很大的不便。
标签: c++ refactoring encapsulation accessor