c++实现property的问题

2

今天才知道通过 __declspec(property()) 可以实现类似于 c# 的 get set

不过当属性为 public 时,所指向的两个方法必须均为 public 方法,也就是说可以单独调用它们,这是我所不希望的

请问有没有什么方法可以将它们隐藏起来?

C++
ava
无名氏

2020-4-17

1

没有办法。

通过 __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 的。

ava
慢羊羊

2020-4-17

明白,我还是自己造轮子好了 -  无名氏  2020-4-17
技术讨论社区