【问题标题】:External lib friend function外部库友元函数
【发布时间】:2018-11-14 09:22:40
【问题描述】:

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

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

【问题讨论】:

  • GUIkonsola 是否与 class foo 有某种关联?似乎会员正是您想要的 - 可能是 int wgetch() const { return ::wgetch(handle); } 或类似的?
  • 对不起,我错过了,在这个例子中应该是foo,而不是GUIkonsola。而且我试图避免声明新功能,因为其中有很多我只是使用相同的方式 - 使用 handle 成员。

标签: c++ function class member friend


【解决方案1】:

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

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

【讨论】:

  • 在写这个问题时,我很累找到解决方案,并错过了上面示例中未更改的类名(现在它已被编辑并正确)。 “也许你可以定义一个返回句柄值的成员(只读公共访问)”是的,我现在就在做,但它“对用户来说不太方便”并搜索解决方案以更舒适地解决它方式。
【解决方案2】:

鉴于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); }

使用这些类可能会为自己节省大量工作。

【讨论】:

  • 这里有一个useful link,描述了 C++ 绑定的粗糙边缘,以及如何有效地使用它们。
猜你喜欢
  • 2013-03-04
  • 1970-01-01
  • 2014-04-22
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多