c++ - 在 C++ 中是否可以通过类似属性的语法调用访问器?

标签 c++ refactoring encapsulation accessor

我正在处理一个大型代码库,其中有许多公开定义的变量。不幸的是,访问这些变量的功能已经改变,这个新功能最好由公共(public)​​访问器和私有(private)实例变量封装。

所以,我正在尝试进行此更改。为此,我计划将每个公共(public)属性设为私有(private),然后创建访问器。但是,我不想更改任何访问旧公共(public)属性的代码。例如:

将公共(public)属性更改为私有(private)后,我有以下类:

class Test {

    private:
        int item = 5;

    public:
        int GetItem() {
             return item;
        };

        void SetItem(int new_item) {
             item = new_item;
        };
};

以前,“item”曾经是类的公共(public)属性,通过以下方式访问:

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();

非常感谢任何帮助!

最佳答案

你可以使 int item = t.item; 工作,方法是将 item 定义为一个成员变量,其类型是一个带有自定义转换 operator 的辅助类int() 定义。另外,operator=(int new_value) 拦截集合操作。

你做不到的是

int& item = t.item;

int* pitem = &t.item;

因为这两者都支持直接内存访问,无需通过任何 getter 或 setter。在创建引用或指针时,您甚至无法确定会有多少次访问或读取或写入。

关于c++ - 在 C++ 中是否可以通过类似属性的语法调用访问器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36798867/

相关文章:

C++:在不破坏封装的情况下将指针用作私有(private)成员变量?

java - 我可以在构造函数中调用 set 方法吗

c++ - 修改 WAH 压缩位图性能

C++覆盖具有不同返回类型的虚函数

javascript - 如何从 Rails Assets 管道中的不同文件调用 JS 函数

c# - 如何在不为每种情况使用 if 和 switch 语句的情况下重构链中的数百个条件?

c - 有哪些工具可以建议潜在的重构

c++ - 什么是谷歌测试、死亡测试

c++ - 在一维数组中索引不规则网格 X、Y、Z 坐标

XML 结束标记独占一行