外部lib友好功能

时间:2018-06-05 01:21:43

标签: c++ function class member friend

我正在使用wgetch中的curses.h函数,并且想要调用例如wgetch(handle),其中handle是我班级的私有成员。有没有办法在没有定义我的班级的新朋友功能的情况下(如下所示)或者以某种方式制作方法?

class foo {
    WINDOW *handle;
public:
    friend int wgetch(foo &t) { wgetch(t.handle); };
}

2 个答案:

答案 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); }

通过使用这些类,您可以节省大量的工作。