Вызов статической функции нестатическая функция в C++ [закрыто]
У меня есть класс типа:
Class Test
{
public:
void Check(){//dosomething};
static void call(){//I want to call check()};
};
потому что call () является статическим членом, поэтому он не может вызывать нестатические функции, поэтому я думаю, что использовать Check () в call ()-это создать тестовый указатель, а затем указать Check (), но я думаю, что это не хорошо, есть ли лучший способ сделать это? Я могу переписать все в статической функции, поэтому мне не нужно снова вызывать Check (), но я хочу повторно использовать код в Check () и избегать повторного кода.
4 ответов
поскольку вам нужен экземпляр, вам нужно либо создать его, либо использовать статический экземпляр, либо вставить его в call()
:
Class Test
{
private:
static Test instance;
public:
void Check(){//dosomething};
// use one of the following:
static void call(Test& t){ t.check(); };
static void call(){ Test t; t.check(); };
static void call(){ instance.check(); };
};
это звучит так, как будто происходит какой-то плохой дизайн.
в любом случае, что вы можете сделать, это создать экземпляр Test in call и проверить вызов этого экземпляра. Реализация вызова была бы чем-то вроде этого:
void call(){
Test test;
test.Check();
}
однако обратите внимание, что если Check что-то делает с членами Test, он, конечно, будет применяться только к созданному тестовому объекту. Я бы переосмыслил, действительно ли вы хотите, чтобы call был статичным, или проверить, не быть.
ключ, отличный от нестатической и статической функции-члена, заключается в том, что последняя не имеет никакого объекта. Однако он по-прежнему имеет те же права доступа, что и все остальные члены.
когда вы хотите вызвать нестатическую функцию-член из статического члена, вам все равно нужно придумать объект. Часто статическая функция-член передается в некотором контексте, чтобы добраться до объекта. Из звуков вашего вопроса кажется, что статика и нестатические функции предназначены для выполнения подобных вещей,которые не требуют и не возражают. В этом случае, вероятно, лучше всего разложить общую часть, не зависящую от какого-либо объекта, на другую функцию, которая затем вызывается из обоих call()
и Check()
:
void Test::call() {
common();
// ... other code
}
void Test::Check() {
common();
// ... other code, possibly depending on "this"
}
void Test::common() {
// logic shared by both call() and Check() but not depending on "this"
}
Если общий код нуждается в объекте, нет другого способа, кроме как придумать объект в вашей статической функции-члене.
на это нет простого ответа. Есть разные вещи, которые вы могли бы сделать, но это зависит от того, что означает ваш код. Это конструкция вопрос, а не вопрос программирования.
вы уже предложили различные трюки программирования, которые вы могли бы сделать, например, создать Test
указатель (на самом деле вам не нужен Test
указатель, просто