Доступ к приватному статическому методу извне класса Stack Overflow

Как именно вы можете получить доступ к закрытому статическому методу извне класса. Скажи у меня класс

    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

Решение

Ты не можешь Это именно то, что 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);
5

Другие решения

Вы можете, если знаете адрес функции:

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;
}

Это просто взломать. Очень небезопасно и зависит от компилятора \ системы. Не используйте его в реальных проектах.

0

Спасибо, спросив друга, я нашел другой способ:
Делая функцию doSomething () другом класса ABC.

0

Я новичок в C ++, но вы можете получить доступ к закрытым статическим методам через указатели, передаваемые как обратные вызовы, что позволяет гарантировать, что методы не могут быть вызваны напрямую. Это может быть сделано без использования функции друга, так как указатель обратного вызова регистрируется с использованием конструктора класса. Например, следующее сделает метод «print» доступным в качестве обратного вызова, не допуская прямого вызова метода 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();
}
-1
По вопросам рекламы [email protected]