从类C ++外部访问私有静态方法

时间:2014-07-10 00:46:44

标签: c++ methods static private invoke

如何从类外部访问私有静态方法。说,我有一个班级

    Class ABC {
    private:
        static void print(string str) {
            cout << "It works!!!" << endl;
        }
    };

现在,我只是从另一个函数调用print()函数,如:

    void doSomething() {
         string str = "1776a0";
         // Call to print() here
    }

我已经搜索了互联网和stackoverflow这样的问题,但我找不到多少。 所以,请指出我是否正确的方向,如果可能的话,如何做到这一点。

我目前正在使用GCC。

提前谢谢大家。

4 个答案:

答案 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();
}