Как именно вы можете получить доступ к закрытому статическому методу извне класса. Скажи у меня класс
Class ABC {
private:
static void print(string str) {
cout << "It works!!!" << endl;
}
};
Теперь я просто вызываю функцию print (), скажем, из другой функции, например:
void doSomething() {
string str = "1776a0";
// Call to print() here
}
Я искал в интернете и stackoverflow для такой проблемы, но я не мог найти много.
Поэтому, пожалуйста, укажите мне правильное направление относительно того, возможно ли это или нет, и если да, то как это сделать.
В настоящее время я использую GCC.
Спасибо всем заранее.
Ты не можешь Это именно то, что 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);
Вы можете, если знаете адрес функции:
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;
}
Это просто взломать. Очень небезопасно и зависит от компилятора \ системы. Не используйте его в реальных проектах.
Спасибо, спросив друга, я нашел другой способ:
Делая функцию doSomething () другом класса ABC.
Я новичок в 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();
}