【发布时间】:2013-02-04 22:29:39
【问题描述】:
使用 C++ for Windows 进行编程,尽管这种情况可能在任何地方出现。这是我的问题的简化版本,以使问题易于管理,因此不要太关注细节:)
我有一个类 class Window,其中包含一个 windows HWND 数据项。我想完全封装HWND,以便该类的用户必须通过该类才能对该窗口执行任何操作,因此它存储在一个私有成员变量中。我不想为其提供任何公共“getter”,因为这会破坏封装,允许用户绕过我的课程。
现在我想创建一个类class Direct3d11 来封装一些directx api。为了创建这个类的一个实例,它需要一个窗口的 HWND,所以我在它的构造函数中传递了一个 Window 对象。
class Direct3D11
{
public:
Direct3D11(const Window& window);
};
在构造函数内部,它可以访问窗口对象,但是它需要包含在其中的 HWND 才能物理创建 Direct3D11 类将管理的窗口对象,但它无法获取该信息.
我可以添加一个私有的getter函数来获取HWND到Window类,然后让Direct3D11类成为Window的友元类,这样它就可以调用该函数了。
然而,这似乎不是很优雅,尤其是因为 Window 类根本不需要了解有关 Direct3D11 类的任何信息。
我是否错过了实现这一目标的更好方法?朋友类没有吸引力,拥有公共 getter 函数也没有太大吸引力。
【问题讨论】:
-
在我看来确实是
friend的用例。 -
您基本上有两个选择,要么让所有人都可以使用 getter(即使其成为
public),要么使其仅对某些其他人可用(即使用friend)。这些是合乎逻辑的可能性。关于我能想到的唯一其他不同的方法是让Direct3D11继承自Window;这是否有意义取决于您... ;) -
@OliCharlesworth:恕我直言,这令人讨厌。我仍然喜欢将继承视为 IS-A 关系的一种形式(尽管它不能真正准确地对其进行建模,但那是另一回事了)。在这里,使
Direct3D11继承自Window将建立无意义的关系。我想这是friend的自然用例。 -
有很多 Windows API 需要 HWND,Direct3D 只是一个例子。我认为你应该只为 HWND 提供一个吸气剂,否则你会限制用户太多。
-
您可以创建一个中间类,它是 Windows 的朋友,它通过私有访问器访问 HWND,然后将该类与 Direct3D11 建立朋友关系。但是,在我看来,这似乎毫无意义。
标签: c++