为静态 class 方法定义友元函数?
Define a friend function for a static class method?
有人知道如何让外界访问私有静态方法吗?我能想到的唯一方法是通过朋友功能,但这似乎行不通。
头文件在这里:
#pragma once
#include <iostream>
class MyClass {
public:
friend void AtFork();
private:
static void Disp() { std::cout << "hello world" << std::endl; }
};
在此处实现文件:
#include "test.h"
namespace {
void AtFork() {
MyClass::Disp();
}
}
int main() {
AtFork();
}
错误信息是:
test.cc:6:11: error: 'Disp' is a private member of 'MyClass'
MyClass::Disp();
^
./test.h:10:15: note: declared private here
static void Disp() { std::cout << "hello world" << std::endl; }
上下文:为了获得 fork-safe(由于一堆遗留代码),我通过绑定 fork 钩子重新初始化了第三个库,我认为它不应该暴露给 public.
上面的例子,让AtFork
可以调用MyClass::Disp
。
您的代码中的问题是匿名命名空间。 main.cpp
中的 AtFork
只能在 main.cpp
内访问。您声明为朋友的 AtFork
是不同的。不要使用匿名命名空间,代码可以正常编译:
#include <iostream>
class MyClass {
public:
friend void AtFork();
private:
static void Disp() { std::cout << "hello world" << std::endl; }
};
//namespace {
void AtFork() {
MyClass::Disp();
}
//}
int main() {
AtFork();
}
尽管您可以根据需要将 AtFork
放在(命名的)命名空间中:
#include <iostream>
namespace foo { void AtFork();}
class MyClass {
public:
friend void foo::AtFork();
private:
static void Disp() { std::cout << "hello world" << std::endl; }
};
namespace foo{
void AtFork() {
MyClass::Disp();
}
}
int main() {
foo::AtFork();
}
有人知道如何让外界访问私有静态方法吗?我能想到的唯一方法是通过朋友功能,但这似乎行不通。
头文件在这里:
#pragma once
#include <iostream>
class MyClass {
public:
friend void AtFork();
private:
static void Disp() { std::cout << "hello world" << std::endl; }
};
在此处实现文件:
#include "test.h"
namespace {
void AtFork() {
MyClass::Disp();
}
}
int main() {
AtFork();
}
错误信息是:
test.cc:6:11: error: 'Disp' is a private member of 'MyClass'
MyClass::Disp();
^
./test.h:10:15: note: declared private here
static void Disp() { std::cout << "hello world" << std::endl; }
上下文:为了获得 fork-safe(由于一堆遗留代码),我通过绑定 fork 钩子重新初始化了第三个库,我认为它不应该暴露给 public.
上面的例子,让AtFork
可以调用MyClass::Disp
。
您的代码中的问题是匿名命名空间。 main.cpp
中的 AtFork
只能在 main.cpp
内访问。您声明为朋友的 AtFork
是不同的。不要使用匿名命名空间,代码可以正常编译:
#include <iostream>
class MyClass {
public:
friend void AtFork();
private:
static void Disp() { std::cout << "hello world" << std::endl; }
};
//namespace {
void AtFork() {
MyClass::Disp();
}
//}
int main() {
AtFork();
}
尽管您可以根据需要将 AtFork
放在(命名的)命名空间中:
#include <iostream>
namespace foo { void AtFork();}
class MyClass {
public:
friend void foo::AtFork();
private:
static void Disp() { std::cout << "hello world" << std::endl; }
};
namespace foo{
void AtFork() {
MyClass::Disp();
}
}
int main() {
foo::AtFork();
}