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