今天才知道通过 __declspec(property()) 可以实现类似于 c# 的 get set
不过当属性为 public 时,所指向的两个方法必须均为 public 方法,也就是说可以单独调用它们,这是我所不希望的
请问有没有什么方法可以将它们隐藏起来?
今天才知道通过 __declspec(property()) 可以实现类似于 c# 的 get set
不过当属性为 public 时,所指向的两个方法必须均为 public 方法,也就是说可以单独调用它们,这是我所不希望的
请问有没有什么方法可以将它们隐藏起来?
没有办法。
通过 __declspec(property()) 定义的属性,本质上只是另外两个函数的别名。
下面我简单说说验证方法(以下步骤基于 Visual C++ 2019 社区版)。
先定义一个含有属性 X 的对象:
class Obj
{
int m_x;
public:
__declspec(property(get = GetX, put = SetX)) int X;
int GetX()
{
return m_x;
};
void SetX(int x)
{
m_x = x;
};
};
int main()
{
Obj test;
test.X = 3;
int a = test.X;
return 0;
}
然后,以 [x86|Debug] 成功编译代码。
再然后按 F10 进入调试状态,点菜单 Debug -> Windows -> Disassembly(或按 Alt + 8),查看汇编代码。会看到对属性 X 的操作的具体汇编代码是这样的:
test.X = 3;
00051798 push 3
0005179A lea ecx,[test]
0005179D call Obj::SetX (051118h)
int a = test.X;
000517A2 lea ecx,[test]
000517A5 call Obj::GetX (05137Ah)
000517AA mov dword ptr [a],eax
很显然,对属性 X 的调用,实际上都会变为对函数 GetX 和 SetX 的调用。
所以,如果属性 X 是 public 的,那么 GetX 和 SetX 也必须是 public 的。