Как реализовать заголовочный файл C++, который не содержит имени класса?

Обновлено: Спасибо! Я пришел с Java, поэтому оказалось, что я просто не знаком с тем, что такое бесплатные функции и как они работают. Я ценю ответы каждого.

Для задания мне дали заголовочный файл C++ (.h) с кучей пустых функций, которые мне нужно реализовать в отдельном .cpp файле без изменения исходного заголовочного файла. Однако в заголовочном файле никогда не упоминалось явное имя класса или класса - я ожидал, что будет что-то вроде

    ClassName 
    {
       ... functions, etc...
    }

но там ничего, только функции-члены. Конструктора тоже нет.

Поскольку нет класса или имени класса, я не уверен, какой синтаксис использовать для реализации функций-членов в файле .cpp. Где обычно я помещал бы что-то вроде

    returnType ClassName::functionName()
    {
        ...implementation...
    }

Я не уверен, что вставить вместо ClassName, так как класса нет или мне нужно использовать совершенно другой формат. Заранее спасибо!

Вы уверены, что вас не просят реализовать функции уровня пространства имен? Пожалуйста, включите образец файла заголовка.

Richard Critten 17.12.2020 17:29

Сложно сказать, описание для меня не очень понятное. Но похоже, что в заголовке есть ряд бесплатных функций. Это функции, не связанные ни с одним классом. Это может удивить тех, кто пришел из объектно-ориентированных языков, таких как Java. Чтобы реализовать это, вы просто опускаете ClassName в определении. Если функция принадлежит пространству имен, используйте пространство имен вместо имени класса.

François Andrieux 17.12.2020 17:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
933
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

C++ не так объектно-ориентирован, как Java или C#, и допускает свободные функции, существующие вне какого-либо класса. Кажется, что ваш заголовок объявляет именно это.

Используйте просто

returnType functionName() //defines a function in current namespace, global or other
{
    ...implementation...
}

Ваш первый пример того, что :: находится в глобальном пространстве имен, (частично) неверен. Если returnType является типом класса, C++ будет анализировать это как разрешение области вне returnType, а не как глобальное пространство имен, и это будет ошибка разбора. Если returnType является встроенным типом, то он анализируется правильно. Это также сработало бы, если бы использовалось auto с завершающим типом возврата.

Human-Compiler 17.12.2020 17:46

Согласитесь, смущает рекомендация использовать этот синтаксис здесь. Я даже никогда не использовал его сам.

Asteroids With Wings 17.12.2020 17:48

На самом деле я беру обратно об этом парсинге правильно вообще. clang выдает предупреждение, но gcc безоговорочно ошибки за явную квалификацию: gcc.godbolt.org/z/qbarMG. Я начинаю сомневаться, является ли это допустимым синтаксисом или расширением

Human-Compiler 17.12.2020 17:50

@ Human-Compiler Исправлено, но я действительно не понимаю, почему это неверно, если returnType не является типом класса. Придется вернуться к стандарту, я думаю.

Yksisarvinen 17.12.2020 17:53

@Human-Compiler Должно быть корректно. Вы не просто в режиме -Werror? Ошибка GCC идентична предупреждению Clang.

Asteroids With Wings 17.12.2020 17:56

Проверьте приведенную выше ссылку на Godbolt; это поведение GCC по умолчанию. Это не Werror=<some warning>, это просто явная ошибка. В таком случае может быть ошибка

Human-Compiler 17.12.2020 17:59

О, поехали. Это "лишнее" и "лишнее" не допускается. Не знаю, почему Clang только предупреждает.

Asteroids With Wings 17.12.2020 17:59
Кажется, со временем правила изменились (прикинь)
Asteroids With Wings 17.12.2020 18:00

@AsteroidsWithWings Я думаю, clang поддерживает его как расширение -- TIL. Хорошая находка!

Human-Compiler 17.12.2020 18:02

@ Human-Compiler Я думаю, что GCC устарел, поскольку не разрешает это с C++ 14. Но, если честно, я практически отказался от попыток отслеживать все эти крошечные изменения в языке. Это скучно. :П

Asteroids With Wings 17.12.2020 18:09

Вам не нужно вставлять имя класса, вам просто нужно правильно написать объявленную сигнатуру функции в заголовочном файле:

файл.h

#ifndef HEADER_H
#define HEADER_H

void f ();
void g ();

#endif

файл.cpp


#include "file.h"

void f ()
{

}

void g ()
{

}

Однако в заголовочном файле никогда не упоминается явный класс или имя класса.

Это нормально; не все должно быть в классе.

И если у вас сложилось впечатление, что заголовок предназначен только для объявлений вещей, связанных с классом (поскольку некоторые курсы имеют тенденцию называть их в честь классов, определения которых они содержат), это не так! Заголовок может содержать объявления чего угодно! Класс, несколько классов, неклассовые вещи, смесь всего вышеперечисленного…

нет ничего, только функции-члены.

Это не функции-члены; это просто… функции.

Конструктора тоже нет.

Это тоже нормально! Только классам нужны конструкторы.

Поскольку нет класса или имени класса, я не уверен, какой синтаксис использовать для реализации функций-членов в файле .cpp.

Функции просто определяются следующим образом:

int foo(…)
{
   /* code */
}

…где int — тип возвращаемого значения, foo — имя, а — мой заполнитель для ваших аргументов (если применимо).

Вот и все!

В вашем учебнике должна быть глава о так называемых «свободных функциях», вероятно, перед занятиями.

Другие вопросы по теме