我在c ++应用程序中看到过一次只使用带有头文件和源文件的命名空间声明,如下所示:
#ifndef _UT_
#define _UT_
#include <string>
#include <windows.h>
namespace UT
{
void setRootPath(char* program_path, char* file_path);
char * ConvertStringToCharP(std::string str);
};
#endif
//and then in UT.cpp
#include "UT.h"
namespace UT
{
char * ConvertStringToCharP(std::string str)
{
char * writable = new char[str.size() + 1];
std::copy(str.begin(), str.end(), writable);
writable[str.size()] = '\0';
return writable;
}
void setRootPath(char* program_path, char* file_path)
{
//...
}
}
比使用静态方法定义经典类更好吗?
或者只是简单的课程?
剂量这种方法对编译器链接器有什么好处?
此命名空间中的方法被称为分配。
答案 0 :(得分:5)
在性能方面,在static
中拥有namespace
类成员和自由函数之间没有区别。这是一个逻辑问题。你的职能是否与班级有关?
一个很好的问题要问自己 - 你是否为了更好的组织而在课堂上创建static
成员函数(或者只是为了将它们组合在一起)?如果答案是是的,您应该使用namespace
。
答案 1 :(得分:5)
通过剪切巧合,我碰巧在Stack Overflow中阅读this answer略有不同的问题。用户rhalbersma给了Dr Dobb's article一个很好的链接,其中作者Scott Meyers解释了如何在类之外实现方法(非朋友方法),但在同一名称空间内实际改进封装。对我来说,今天这是一个很好的学习。希望这对你也有帮助。
答案 2 :(得分:4)
当方法的含义独立于类时,您将方法放在所有类之外。其他语言中的静态类(Java,C#)是一种补偿无法将方法放在类外的方法。由于C ++通过名称空间提供了这种开箱即用的功能,因此使用额外的“静态类”对于代码的读者来说是违反直觉的。
答案 3 :(得分:1)
使用静态class
成员函数的主要原因是与类及其成员的逻辑和概念关系。
另一个原因可能是启用模板部分特化,这对于函数模板是允许的,但对于类来说是不允许的。
否则,请使用独立函数(在适当的namespace
中定义)。
答案 4 :(得分:0)
默认情况下,您应该始终尝试最小化类的方法。如果您可以在类方面实现功能,而不是在应该在类中实现。换句话说,如果您可以通过使用已发布的公共接口来实现所需的功能,那么您应该这样做。这极大地降低了代码对实现细节的依赖性。
因此,如果你可以在一个适当的命名空间中在类之外实现它,这个命名空间似乎与该类有关。
编辑:OP似乎真的在询问是否实现名称空间或静态类作为实用程序/相关函数的持有者对象。在我看来,命名空间是正确的方法,因为这是他们的目的。没必要上课。答案 5 :(得分:0)
没有绝对的规则,但总的来说,除非功能显示
很大程度的连贯性,你想要关闭“命名空间”
由于某种原因,客户端无法使用namespace
向其添加功能
通常优于使用class
。当然,除非意图
是使它们可用于模板:您可以实例化模板
在类上,但不在命名空间上。 (这种技术通常被称为
“特质”;没有非静态成员的类称为traits类。)
即使您使用名称空间,也应该定义函数:
void UT::setRootPath( char const* programPath, char const* filePath)
{
// ...
}
char* UT::convertStringToCharP( std::string const& str )
{
// ...
}
这样,函数签名中的任何拼写错误都将被检测到 编译器。