Внешняя функция lib friend - PullRequest
0 голосов
/ 05 июня 2018

Я использую функцию wgetch из curses.h и хочу вызвать, например, wgetch(handle), где handle является закрытым членом моего класса.Есть ли способ сделать это без определения новой функции друга моего класса (как показано ниже) или, может быть, сделать метод каким-то образом?

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

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Учитывая, что handle является личным, то единственный доступ к нему могут получить члены вашего класса и его друзья.

Код, который у вас есть (который передает экземпляр foo функции друга)является сложным и нетрадиционным по сравнению с простым наличием функции-члена:

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

Похоже, что вы пишете оболочку C ++ для Curses WINDOW*, поэтому многие маленькие элементы пересылки могут показаться естественным подходом,Обратите внимание, что нам нужен оператор области видимости :: для устранения неоднозначности wgetch, который мы намереваемся вызвать.

Вы, вероятно, должны знать, что NCurses действительно имеет свои собственные оболочки C ++.Несмотря на то, что они недокументированы, мы видим, что определение NCursesWindow::getch() выглядит точно так же, как описанный выше метод (см. cursesw.h, строка 953):

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

Вы можете сэкономить много работы, используя этиклассы.

0 голосов
/ 06 июня 2018

Доступ к личным данным ограничен реализацией класса и друзьями (используйте друзей только при необходимости).Таким образом, нет, пока handle является частным, нет никаких вариантов доступа к нему, кроме друзей и участников.

При этом, доступ не обязательно должен быть в функции, которую вы пытаетесьнаписать.Если есть реальная причина не определять wgetch члена вашего класса, возможно, вы могли бы определить члена, который возвращает значение handle (открытый доступ только для чтения).Это кажется менее удобным для пользователей вашего класса.

...