Обновлено: Спасибо! Я пришел с Java, поэтому оказалось, что я просто не знаком с тем, что такое бесплатные функции и как они работают. Я ценю ответы каждого.
Для задания мне дали заголовочный файл C++ (.h) с кучей пустых функций, которые мне нужно реализовать в отдельном .cpp файле без изменения исходного заголовочного файла. Однако в заголовочном файле никогда не упоминалось явное имя класса или класса - я ожидал, что будет что-то вроде
ClassName
{
... functions, etc...
}
но там ничего, только функции-члены. Конструктора тоже нет.
Поскольку нет класса или имени класса, я не уверен, какой синтаксис использовать для реализации функций-членов в файле .cpp. Где обычно я помещал бы что-то вроде
returnType ClassName::functionName()
{
...implementation...
}
Я не уверен, что вставить вместо ClassName, так как класса нет или мне нужно использовать совершенно другой формат. Заранее спасибо!
Сложно сказать, описание для меня не очень понятное. Но похоже, что в заголовке есть ряд бесплатных функций. Это функции, не связанные ни с одним классом. Это может удивить тех, кто пришел из объектно-ориентированных языков, таких как Java. Чтобы реализовать это, вы просто опускаете ClassName
в определении. Если функция принадлежит пространству имен, используйте пространство имен вместо имени класса.
C++ не так объектно-ориентирован, как Java или C#, и допускает свободные функции, существующие вне какого-либо класса. Кажется, что ваш заголовок объявляет именно это.
Используйте просто
returnType functionName() //defines a function in current namespace, global or other
{
...implementation...
}
Ваш первый пример того, что ::
находится в глобальном пространстве имен, (частично) неверен. Если returnType
является типом класса, C++ будет анализировать это как разрешение области вне returnType
, а не как глобальное пространство имен, и это будет ошибка разбора. Если returnType
является встроенным типом, то он анализируется правильно. Это также сработало бы, если бы использовалось auto
с завершающим типом возврата.
Согласитесь, смущает рекомендация использовать этот синтаксис здесь. Я даже никогда не использовал его сам.
На самом деле я беру обратно об этом парсинге правильно вообще. clang
выдает предупреждение, но gcc
безоговорочно ошибки за явную квалификацию: gcc.godbolt.org/z/qbarMG. Я начинаю сомневаться, является ли это допустимым синтаксисом или расширением
@ Human-Compiler Исправлено, но я действительно не понимаю, почему это неверно, если returnType не является типом класса. Придется вернуться к стандарту, я думаю.
@Human-Compiler Должно быть корректно. Вы не просто в режиме -Werror
? Ошибка GCC идентична предупреждению Clang.
Проверьте приведенную выше ссылку на Godbolt; это поведение GCC по умолчанию. Это не Werror=<some warning>
, это просто явная ошибка. В таком случае может быть ошибка
О, поехали. Это "лишнее" и "лишнее" не допускается. Не знаю, почему Clang только предупреждает.
@AsteroidsWithWings Я думаю, clang
поддерживает его как расширение -- TIL. Хорошая находка!
@ Human-Compiler Я думаю, что GCC устарел, поскольку не разрешает это с C++ 14. Но, если честно, я практически отказался от попыток отслеживать все эти крошечные изменения в языке. Это скучно. :П
Вам не нужно вставлять имя класса, вам просто нужно правильно написать объявленную сигнатуру функции в заголовочном файле:
#ifndef HEADER_H
#define HEADER_H
void f ();
void g ();
#endif
#include "file.h"
void f ()
{
}
void g ()
{
}
Однако в заголовочном файле никогда не упоминается явный класс или имя класса.
Это нормально; не все должно быть в классе.
И если у вас сложилось впечатление, что заголовок предназначен только для объявлений вещей, связанных с классом (поскольку некоторые курсы имеют тенденцию называть их в честь классов, определения которых они содержат), это не так! Заголовок может содержать объявления чего угодно! Класс, несколько классов, неклассовые вещи, смесь всего вышеперечисленного…
нет ничего, только функции-члены.
Это не функции-члены; это просто… функции.
Конструктора тоже нет.
Это тоже нормально! Только классам нужны конструкторы.
Поскольку нет класса или имени класса, я не уверен, какой синтаксис использовать для реализации функций-членов в файле .cpp.
Функции просто определяются следующим образом:
int foo(…)
{
/* code */
}
…где int
— тип возвращаемого значения, foo
— имя, а …
— мой заполнитель для ваших аргументов (если применимо).
Вот и все!
В вашем учебнике должна быть глава о так называемых «свободных функциях», вероятно, перед занятиями.
Вы уверены, что вас не просят реализовать функции уровня пространства имен? Пожалуйста, включите образец файла заголовка.