Объявление статических функций-членов C ++ друзьями класса, в котором они находятся (синтаксис) - PullRequest
9 голосов
/ 31 декабря 2011

Каков синтаксис объявления статической функции-члена как friend класса, в котором она находится.

class MyClass
{
private:
  static void Callback(void* thisptr); //Declare static member
  friend static void Callback(void* thisptr); //Define as friend of itself
}

Могу ли я сложить ее в эту однострочную строку?

class MyClass
{
private:
  friend static void Callback(void* thisptr); //Declare AND Define as friend
}

Есть ли другой способ сложить все это в одну строку?

Ответ

Пожалуйста, не отрицайте, это связано с моим отсутствием знаний оC ++ статические функции-члены.Ответ в том, что им не нужно быть другом , они уже могут получить доступ к личным пользователям.Так что мой вопрос был несколько недействительным.

Ответы [ 3 ]

5 голосов
/ 31 декабря 2011

На самом деле, нет необходимости использовать друга, если он более точный. Статическая функция-член имеет доступ к внутренним элементам класса, как и обычная функция-член. Разница лишь в том, что у него нет указателя this.

void MyClass::Callback(void* thisptr) {
    MyClass* p = static_cast<MyClass*>(thisptr);
    p->public_func(); // legal
    p->private_func(); // legal
    p->private_int_var = 0; // legal
}
2 голосов
/ 31 декабря 2011

Статическая функция-член имеет доступ к protected / private частям класса по умолчанию, нет необходимости делать ее friend.

#include <iostream>

struct Foo{
  Foo(int i) : an_int(i) {}

  static void print_an_int(Foo& self){
    std::cout << self.an_int;
  }
private:
  int an_int;
};

int main(){
  Foo f(5);
  Foo::print_an_int(f); // output: 5
}
2 голосов
/ 31 декабря 2011

Функция-член класса не может быть другом своего класса - она ​​уже является членом класса и может получить доступ к своим частным лицам.Какой смысл в этом дружить?Это не Facebook ...

...