c как вызвать статическую функцию другого класса в пространстве имен

#c

#c

Вопрос:

Я новичок в C , в следующем коде я хочу вызвать A::f функцию

 namespace Top
{

class B
    {
  public:
    void hello()
    {
      Top::A::f();
    }
    };

class A
    {
    public:
    static void f()
    {
      printf("123n");
    }
    };
}

int main()
{
  Top::B b;
  b.hello();

  return 0;
}
  

Но появилась следующая ошибка

 Error C2039 "f": not a member of "Top" 
Error C3083 "A": The symbol on the left side of "::" must be a type 
Error C3861 "f": Cannot find identifier 
  

Как я могу исправить свой код, спасибо

Ответ №1:

Вы не можете вызвать функцию до ее объявления. Переключите два класса таким образом, чтобы при определении B компилятор уже знал A::f :

 namespace Top
{
class A
    {
    public:
    static void f()
    {
      printf("123n");
    }
    };

class B
    {
  public:
    void hello()
    {
      Top::A::f();
    }
    };
}

int main()
{
  Top::B b;
  b.hello();

  return 0;
}
  

PS: Не тема этого вопроса, но не злоупотребляйте static методами, когда вам действительно нужна свободная функция внутри пространства имен. C предпочитает свободные функции функциям-членам, когда это возможно. Любой метод, который не обязательно должен быть членом, помогает для более чистого дизайна класса.

Комментарии:

1. В качестве альтернатив я бы упомянул ::Top::A::f() и A::f() . Они могут быть более безопасными.

2. @DanielLangr в чем преимущество ::Top::A::f() vs Top::A::f() ? Я имею в виду, я знаю разницу, но как это лучше?

3. Потому что, если, например, кто-то в будущем расширит пространство имен Top вложенным пространством имен Top с другой функцией f или классом / структурой Top со статической функцией-членом f , он может вызвать ее вместо исходной. Живая демонстрация: godbolt.org/z/dr6nEW . Я знаю, что это относительно маловероятно, но лучшие практики есть лучшие практики :). И это может быть более вероятно в реальных сценариях.