Вызов статической функции нестатическая функция в 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 указатель, просто