如何从类外部访问私有静态方法。说,我有一个班级
Class ABC {
private:
static void print(string str) {
cout << "It works!!!" << endl;
}
};
现在,我只是从另一个函数调用print()函数,如:
void doSomething() {
string str = "1776a0";
// Call to print() here
}
我已经搜索了互联网和stackoverflow这样的问题,但我找不到多少。 所以,请指出我是否正确的方向,如果可能的话,如何做到这一点。
我目前正在使用GCC。
提前谢谢大家。
答案 0 :(得分:5)
你不能。这正是private
的含义。如果要从课外调用,请将其设为public
。
您可以从 公开访问的其他功能中调用它,而不是将其设为public
。此其他功能可以是ABC
的公共成员,也可以是friend
功能。
这两种情况都需要更改ABC
的类定义。
如果另一个函数除了调用print()
之外什么都不做,那么你已经达到了与print()
公开相同的效果。但据推测,print
是私有的,例如它依赖于一些先决条件。你可以让其他功能允许。例如:
void abc_printer(string printer_name, string str_to_print)
{
open_printer(printer_name);
ABC::print(str);
close_printer();
}
并在ABC
的类定义中:
friend void abc_printer(string, string);
答案 1 :(得分:0)
如果你知道功能的地址,你可以:
typedef void (*funcPtr)();
class beforeABC
{
public:
static int getRange()
{
char* funcAddr = (char*)&(beforeABC::func);
char* endAddr = (char*)&(beforeABC::end);
return endAddr - funcAddr;
}
static void func() { };
static void end() { };
};
class ABC
{
private:
static void print()
{
cout << "It works!!!" << endl;
}
public:
static void func()
{
// does not works without this line. Can someone explain this?
if(0 == (unsigned long int)&print);
};
};
int main()
{
ABC::func();
funcPtr f = (funcPtr)((char*)&(beforeABC::end) + beforeABC::getRange());
f();
return 0;
}
这只是一个黑客。非常不安全和编译器\系统相关。不要在实际项目中使用它。
答案 2 :(得分:0)
谢谢,问朋友我发现了另一种方式: 通过使类ABC的doSomething()函数成为朋友。
答案 3 :(得分:-1)
我是C ++的新手,但您可以通过作为回调传递的指针访问私有静态方法,这仍然允许确保无法直接调用方法。这可以在不需要友元函数的情况下完成,因为回调指针是使用类的构造函数注册的。例如,以下内容将使&#34; print&#34;可用作回调的方法,不允许直接调用print方法:
#include <iostream>
using namespace std;
void RegisterCallback(void (* const fn)(void));
class ABC
{
public:
ABC() {RegisterCallback((void (*)(void))&ABC::print);}
private:
static void print(void)
{
cout << "It works!!!" << endl;
}
};
int main(void)
{
ABC abc;
return 0;
}
void RegisterCallback(void (* const fn)(void))
{
fn();
}