2012-05-03 6 views
1

Как создать кучу методов, которые не зависят от какого-либо объекта (в моем файле нет классов, нет объектов, нет основного, ничего, кроме методов) все в один файл cpp/hpp и как их объявить?методы создания, которые не зависят от объекта

+0

Если у вас нет классов, у вас нет методов. –

+0

И, кстати, вы должны иметь «главную» где-то, чтобы ваша программа была допустимой конструкцией на C++. –

+0

@JohnDibling поэтому dll недействительны C++ «конструкции»? –

ответ

2

Если вы хотите, чтобы быть открытыми, то есть доступны в нескольких единицах трансляции, лучший способ, чтобы включить их в 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() {} 
} 
+2

Забавно, что искатель использовал слово «метод», и все остальные начали его использовать :) –

+0

@SethCarnegie функции: P –

+0

почему два файла? почему я не могу просто объявить их статическими и реализовать их в одном файле hpp? – Glolita

4

Создать namespace. Что-то вроде этого:

Utils.h

namespace Utils 
{ 
    void myMethod(); 
} 

Utils.cpp

namespace Utils 
{ 
    void myMethod() 
    { 
    //Implementation 
    } 
} 
+0

Я уже создаю новое пространство имен с классами, которым нужны эти бесплатные функции, поэтому мне не нужно другое пространство имен, чтобы просто вставить в него пару бесплатных функций, поэтому я подумал, почему я не могу просто реализовать их как встроенные методы в файле hpp, которые я могу включить позже в другие классы ???? – Glolita

+0

@Glolita: Не можете ли вы поместить эти функции в то же пространство имен, что и эти классы. В противном случае, если функции достаточно малы, вы можете сделать их встроенными. – Naveen

+0

Да, это то, о чем я спрашивал, имея их в одном пространстве имен, но делая их как встроенные функции в файле hpp в одном и том же пространстве имен. – Glolita

1

Чтобы определить функцию, которая не зависит от объекта просто объявить их непосредственно.

Использование C++, хотя было бы неплохо объявить их в пространстве имен. Это не дает им dependcy на объекте, но действительно уменьшает глобальное загрязнение пространства имен

// MyFile.h 
namespace MyNamespace { 
    int some_function(); 
} 

// MyFile.cpp 
using MyNamespace; 
int some_function() { 
    return 42; 
} 
+1

Конечно, это не метод, а бесплатная функция. – delnan

1

Вы объявляете им же, как вы бы в C. Он может находиться в пространстве имен или за пределами пространства имен. Нет никакой разницы, кроме того, что они не в классе.

Если вы хотите использовать функции в C позже, вы должны добавить их с extern "C".

extern "C" void foo();

1

Ничто не мешает вам писать бесплатные функции. Если вы считаете, что функция должна быть глобальной, то бесплатные функции вполне уместны.

+0

предположим, что у нас есть наша основная функция в другом файле, и внутри нее нам нужно вызвать эту бесплатную функцию, поэтому что мне делать, чтобы иметь бесплатные функции в каком-то другом файле, которые я буду включать позже в мой основной файл? Я имею в виду, должен ли я сделать файл hpp, где мои свободные функции реализованы там (возможно, как статические встроенные функции)? – Glolita

+0

Да, просто укажите файл заголовка файла, в котором у вас есть бесплатные развлечения в главном файле. –

1

Вы должны поместить их в пространство имен. Пример Навина - это место.

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

namespace Foo 
{ 
    publicFunction1(); 
    publicFunction2(); 

    namespace 
    { 
     privateFunction1(); 
     std::vector<Bar> privateData; 
    } 
} 

Элементы внутри вложенного анонимного пространства имен доступны только для элементов в родительском пространстве имен. Я нашел это особенно полезным.

+0

Но не помещайте анонимные пространства имен в заголовки. –

+1

Методы, объявленные в анонимном пространстве имен в глобальной области видимости, также доступны в этой конкретной единицы перевода, FYI. –

Смежные вопросы