如何在一个cpp / hpp文件中创建一堆不依赖于任何对象的方法(在我的文件中没有类,没有对象,没有main,只有方法)以及如何声明它们?
答案 0 :(得分:4)
创建namespace
。像这样:
<强> Utils.h 强>
namespace Utils
{
void myMethod();
}
<强> Utils.cpp 强>
namespace Utils
{
void myMethod()
{
//Implementation
}
}
答案 1 :(得分: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 :(得分:1)
要定义一个不依赖于对象的函数,只需直接声明它们。
// MyFile.h
int some_function();
// MyFile.cpp
int some_function() {
return 42;
}
使用C ++尽管在命名空间中声明它们是个好主意。这并不能让他们依赖对象,但会减少全局名称空间污染
// MyFile.h
namespace MyNamespace {
int some_function();
}
// MyFile.cpp
using MyNamespace;
int some_function() {
return 42;
}
答案 3 :(得分:1)
您以C
中的方式声明它们。它可以位于命名空间内,也可以位于命名空间之外。除了他们不在课堂上之外没有区别。
如果您想稍后使用C
中的功能,则应在extern "C"
之前添加这些功能。
extern "C" void foo();
答案 4 :(得分:1)
没有什么可以阻止你编写免费功能。如果您认为函数应该是全局函数,则自由函数非常合适。
答案 5 :(得分:1)
您应该将它们放在命名空间中。 Naveen的例子就是现场。
作为补充说明,如果您希望隐藏命名空间中的某些功能或数据单元(从而模仿“私有”访问),请将这些功能和数据单元放在嵌套在父命名空间内的匿名命名空间中。例如:
namespace Foo
{
publicFunction1();
publicFunction2();
namespace
{
privateFunction1();
std::vector<Bar> privateData;
}
}
嵌套的匿名命名空间中的项只能由父命名空间中的项访问。我发现这非常有用。