外部库友元函数

External lib friend function

本文关键字:函数 友元 外部      更新时间:2023-10-16

我正在使用curses.hwgetch函数,并且想调用例如wgetch(handle)句柄是我类的私有成员。有没有办法在不定义我的类的新朋友函数(如下所示(或以某种方式使其成为方法的情况下做到这一点?

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

对私有数据的访问仅限于类实现和朋友(仅在必要时使用朋友(。所以,不,只要handle是私有的,除了朋友和会员之外,没有其他选择可以访问它。

话虽如此,访问不一定必须在您尝试编写的函数中。如果有真正的理由不定义类的wgetch成员,也许您可以定义一个返回handle值的成员(只读公共访问(。不过,对于您类的用户来说,这似乎不太方便。

鉴于handle是私有的,那么访问它的唯一途径是来自您类的成员及其朋友。

与仅具有成员函数相比,您拥有的代码(将foo实例传递给友元函数(是复杂且非常规的:

class foo {
WINDOW *handle;
public:
int wgetch() { return ::wgetch(handle); }
};

看来您正在为诅咒WINDOW*编写一个C++包装器,因此许多小型转发成员似乎是自然的方法。 请注意,我们需要范围运算符::来消除我们打算调用的wgetch的歧义。

您可能应该知道 NCurses 确实包含自己的C++包装器。 虽然这些没有记录,但我们看到NCursesWindow::getch()的定义看起来与上面的方法完全一样(见cursesw.h,第953行(:

int            getch() { return ::wgetch(w); }

使用这些类可以节省大量工作。