Как создать кучу методов, которые не зависят от какого-либо объекта (в моем файле нет классов, нет объектов, нет основного, ничего, кроме методов) все в один файл cpp/hpp и как их объявить?методы создания, которые не зависят от объекта
ответ
Если вы хотите, чтобы быть открытыми, то есть доступны в нескольких единицах трансляции, лучший способ, чтобы включить их в namespace
, объявить их в заголовке и реализовать их в одном файле реализации:
//functions.h
namespace MyFunctions
{
void foo();
void goo();
}
//functions.cpp
namespace MyFunctions
{
void foo() {}
void goo() {}
}
ВАЖНО
Если вы предоставите определение в заголовке, вы должны пометить их inline
, в противном случае, включая этот заголовок в нескольких единицах трансляции может привести к ошибке компоновщика:
//functions.h
inline void foo() {
//..
}
inline void goo() {
//..
}
Если вы только хотите, чтобы они доступны в ЕП, определить их в этом файле реализации в анонимном пространстве имен (или объявить их static
):
//fileThatUsesFunctions.cpp
namespace
{
void foo() {}
void goo() {}
}
Забавно, что искатель использовал слово «метод», и все остальные начали его использовать :) –
@SethCarnegie функции: P –
почему два файла? почему я не могу просто объявить их статическими и реализовать их в одном файле hpp? – Glolita
Создать namespace
. Что-то вроде этого:
Utils.h
namespace Utils
{
void myMethod();
}
Utils.cpp
namespace Utils
{
void myMethod()
{
//Implementation
}
}
Я уже создаю новое пространство имен с классами, которым нужны эти бесплатные функции, поэтому мне не нужно другое пространство имен, чтобы просто вставить в него пару бесплатных функций, поэтому я подумал, почему я не могу просто реализовать их как встроенные методы в файле hpp, которые я могу включить позже в другие классы ???? – Glolita
@Glolita: Не можете ли вы поместить эти функции в то же пространство имен, что и эти классы. В противном случае, если функции достаточно малы, вы можете сделать их встроенными. – Naveen
Да, это то, о чем я спрашивал, имея их в одном пространстве имен, но делая их как встроенные функции в файле hpp в одном и том же пространстве имен. – Glolita
Чтобы определить функцию, которая не зависит от объекта просто объявить их непосредственно.
Использование C++, хотя было бы неплохо объявить их в пространстве имен. Это не дает им dependcy на объекте, но действительно уменьшает глобальное загрязнение пространства имен
// MyFile.h
namespace MyNamespace {
int some_function();
}
// MyFile.cpp
using MyNamespace;
int some_function() {
return 42;
}
Конечно, это не метод, а бесплатная функция. – delnan
Вы объявляете им же, как вы бы в C
. Он может находиться в пространстве имен или за пределами пространства имен. Нет никакой разницы, кроме того, что они не в классе.
Если вы хотите использовать функции в C
позже, вы должны добавить их с extern "C"
.
extern "C" void foo();
Ничто не мешает вам писать бесплатные функции. Если вы считаете, что функция должна быть глобальной, то бесплатные функции вполне уместны.
предположим, что у нас есть наша основная функция в другом файле, и внутри нее нам нужно вызвать эту бесплатную функцию, поэтому что мне делать, чтобы иметь бесплатные функции в каком-то другом файле, которые я буду включать позже в мой основной файл? Я имею в виду, должен ли я сделать файл hpp, где мои свободные функции реализованы там (возможно, как статические встроенные функции)? – Glolita
Да, просто укажите файл заголовка файла, в котором у вас есть бесплатные развлечения в главном файле. –
Вы должны поместить их в пространство имен. Пример Навина - это место.
В качестве дополнительного примечания, если вы хотите скрыть определенные функции или единицы данных в пространстве имен (таким образом, имитируя «закрытый» доступ), поместите эти функции и единицы данных в анонимное пространство имен, вложенное в родительское пространство имен.Например:
namespace Foo
{
publicFunction1();
publicFunction2();
namespace
{
privateFunction1();
std::vector<Bar> privateData;
}
}
Элементы внутри вложенного анонимного пространства имен доступны только для элементов в родительском пространстве имен. Я нашел это особенно полезным.
Но не помещайте анонимные пространства имен в заголовки. –
Методы, объявленные в анонимном пространстве имен в глобальной области видимости, также доступны в этой конкретной единицы перевода, FYI. –
- 1. методы тестирования, которые зависят друг от друга
- 2. Создание шаблонов, которые зависят от типа объекта
- 3. Методы тестирования, которые зависят от по существу случайной переменной экземпляра
- 4. вызовы функции тестирования, которые зависят от объекта, возвращенного обратного вызова
- 5. Создания значения в отдельных колонках, которые зависят от различных подстрок
- 6. Две модели, которые зависят друг от друга для создания экземпляров
- 7. Свойства, которые зависят от другого объекта с проверкой
- 8. Async Файлы Javascript, которые зависят от заказа
- 9. Найти объекты, которые зависят от sp
- 10. DLL плагинов, которые зависят от других DLL.
- 11. Свойства Dependecy, которые зависят от других свойств
- 12. Свойства Spring, которые зависят от других свойств
- 13. Настроить ограничения, которые зависят от рамки супервизора
- 14. Три варианта HTML, которые зависят от предыдущих
- 15. CMake библиотеки, которые зависят друг от друга
- 16. Тестирование пакетов, которые зависят от настроек Meteor
- 17. Найти все таблицы, которые зависят от
- 18. Классы Java, которые зависят друг от друга
- 19. Какие библиотеки JavaScript не зависят от объекта документа и навигатора?
- 20. Алгоритмы оптимизации, которые не зависят от исходного решения
- 21. Создайте приложения C#, которые не зависят от структуры?
- 22. Можно ли использовать единые методы тестирования, которые зависят от отдельных критериев NHibernate?
- 23. Rails: Инициализация атрибутов, которые зависят друг от друга
- 24. Добавление префиксов, которые зависят от кодов для этих кодов
- 25. Как найти артефакты, которые зависят от другого артефакта?
- 26. высчитывает среднее клеток, которые зависят от других клеток колонки
- 27. Как автоувеличивать различные реализации интерфейса, которые зависят друг от друга?
- 28. Как объединить несколько массивов, которые зависят от функции в PHP?
- 29. Как я могу проверить методы, которые сильно зависят от MFC с GTest
- 30. IPython: Создание переменных, которые зависят от индекса петли
Если у вас нет классов, у вас нет методов. –
И, кстати, вы должны иметь «главную» где-то, чтобы ваша программа была допустимой конструкцией на C++. –
@JohnDibling поэтому dll недействительны C++ «конструкции»? –