我正在使用wgetch
中的curses.h
函数,并且想要调用例如wgetch(handle)
,其中handle是我班级的私有成员。有没有办法在没有定义我的班级的新朋友功能的情况下(如下所示)或者以某种方式制作方法?
class foo {
WINDOW *handle;
public:
friend int wgetch(foo &t) { wgetch(t.handle); };
}
答案 0 :(得分:1)
对私有数据的访问仅限于类实现和朋友(仅在必要时使用朋友)。所以,不,只要handle
是私有的,除了朋友和成员之外,没有其他方法可以访问它。
话虽如此,访问不一定必须在您尝试编写的功能中。如果确实没有定义类的wgetch
成员,可能您可以定义一个返回handle
(只读公共访问)值的成员。这对你班级的用户来说似乎不太方便。
答案 1 :(得分:0)
鉴于handle
是私有的,那么唯一的访问权限来自您班级的成员及其朋友。
与仅具有成员函数相比,您拥有的代码(将foo
的实例传递给朋友函数)是复杂且非常规的:
class foo {
WINDOW *handle;
public:
int wgetch() { return ::wgetch(handle); }
};
您似乎正在为Curses WINDOW*
编写C ++包装器,因此许多小型转发成员似乎是自然的方法。请注意,我们需要作用域运算符::
来消除我们打算调用的wgetch
的歧义。
你可能应该知道NCurses确实包含了自己的C ++包装器。虽然这些都没有记录,但我们发现NCursesWindow::getch()
的定义与上面的方法完全相同(参见cursesw.h
,第953行):
int getch() { return ::wgetch(w); }
通过使用这些类,您可以节省大量的工作。