将C++静态成员函数声明为所在类的友元(语法)

10

如何声明一个静态成员函数作为其所在类的 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++静态成员函数知识不足造成的。答案是它们不需要成为友元,它们已经可以访问私有成员。因此,我的问题有些无效。


如果是友元,就不需要使用 static。 - KV Prajapati
如果@AVD不是静态的,那么它就不能被C调用。这也是它一开始就被定义为静态的原因。 - unixman83
@unixmax83:无论如何,它都不能被C调用,因为它还需要声明为extern "C"。虽然大多数编译器允许从C中调用没有这个声明的函数,并且它可以工作,但它不是可移植的,因为有些系统对于C和C++函数有不同的调用约定。 - Dietmar Kühl
3个回答

7

实际上,如果是静态的话,不需要使用 friend 更准确。静态成员函数像普通成员函数一样可以访问类的内部。唯一的区别是它没有 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
}

我之前使用了 reinterpret_cast<MyClass*>,感谢您的纠正。 - unixman83
这里使用reinterpret_cast没有问题。根据大多数C++实现,从void*转换,static_cast和reinterpret_cast应该产生相同的代码。 - jmucchiello

2

类成员函数不能成为其自身类的友元 - 它已经是类成员并且可以访问其私有成员。那么交友的意义何在?这不是Facebook...


2
一个静态成员函数默认可以访问类的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
}

只是想指出:函数是否为静态完全无关紧要。任何类成员函数都可以访问类的私有/受保护部分。 - littleadv
1
@littleadv:这很明显,OP的误解似乎正是在于这一点,即静态成员函数在访问检查方面与普通成员函数没有任何区别。 - Xeo
不是我想要的答案。jmucchiello用指针给出了一个例子,而你的答案是通过引用实现的。 - unixman83
@unixman:嗯...这在任何情况下都无关紧要,概念仍然是相同的。静态类成员->可以访问受保护/私有内容。 - Xeo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接