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

Vei*_*ita 0 c++ refactoring encapsulation accessor

我正在使用大型代码库,并且有许多公开定义的变量.不幸的是,访问这些变量的功能已经改变,这个新功能最好由公共​​访问器和私有实例变量封装.

所以,我正在努力做出这一改变.为此,我计划将每个公共属性设为私有,然后创建访问器.但是,我不想更改任何访问旧公共属性的代码.例如:

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

class Test {

    private:
        int item = 5;

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

        void SetItem(int new_item) {
             item = new_item;
        };
};
Run Code Online (Sandbox Code Playgroud)

在过去,"item"曾经是该类的公共属性,它通过以下方式访问:

Test* t = new Test();
int item = t->item;
Run Code Online (Sandbox Code Playgroud)

现在,我需要在检索"项目"的方式中添加新功能.例如:

int GetItem() {
     //  Some complicated code which changes "item"
     return item;
};
Run Code Online (Sandbox Code Playgroud)

我怎样才能保持相同的语法:

int item = t->item;
Run Code Online (Sandbox Code Playgroud)

但实际上这有效:

int item = t->GetItem();
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏!

Ben*_*igt 5

您可以int item = t.item;通过定义item作为成员变量来创建工作,该变量的类型是辅助类,并定义了自定义转换operator int().另外,operator=(int new_value)拦截设置操作.

你不能做的工作是

int& item = t.item;
Run Code Online (Sandbox Code Playgroud)

要么

int* pitem = &t.item;
Run Code Online (Sandbox Code Playgroud)

因为这两者都可以直接访问内存,而无需通过任何getter或setter.在创建引用或指针时,您甚至无法确定将有多少次访问,或者它们是读取还是写入.