C++何时将方法放在类之外
c++ when to put method out side the class
我看到有时在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()] = ' ';
return writable;
}
void setRootPath(char* program_path, char* file_path)
{
//...
}
}
比用静态方法定义经典类更好吗?
还是只是简单的类?
这种方法对编译器链接器有更好的效果吗?
此命名空间中的方法称为 分配时间 。
的是,我碰巧在堆栈溢出中阅读了这个答案,这是一个略有不同的问题。用户 rhalbersma 给出了一个很好的链接到 Dr. Dobb 的文章,作者 Scott Meyers 解释了如何在类外部实现的方法(非友元方法),但在同一命名空间内实际上改进了封装。对我来说,今天是一个很好的学习。希望这也对您有所帮助。
在性能方面,在namespace
中拥有static
类成员和自由函数之间没有区别。不过,这是一个逻辑问题。你的函数是否与类相关?
问自己的一个好问题 - 您在类中创建 static
成员函数只是为了更好地组织(还是只是为了将它们组合在一起)?如果答案是肯定的,您可能应该使用 namespace
.
当方法的含义与类无关时,将方法放在所有类之外。 其他语言(Java,C#)中的静态类是一种补偿无法将方法放在类之外的方法。由于C++通过命名空间提供了这种开箱即用的能力,因此使用额外的"静态类"对于代码的读者来说是违反直觉的。
使用静态class
成员函数的主要原因是与类及其成员的逻辑和概念关系。
另一个原因可能是启用模板部分专用化,函数模板不允许这样做,但类允许这样做。
否则,请使用独立函数(在相应的namespace
中定义)。
没有绝对规则,但一般来说,除非函数显示非常大的连贯性,你想关闭"命名空间"出于某种原因,因此客户端无法使用namespace
向其添加函数通常比使用 class
更可取。 当然,除非意图是使它们可用于模板:您可以实例化模板在类上,但不在命名空间上。 (这种技术通常被称为"特征";没有非静态成员的类称为特征类。
即使使用命名空间,也应定义以下函数:
void UT::setRootPath( char const* programPath, char const* filePath)
{
// ...
}
char* UT::convertStringToCharP( std::string const& str )
{
// ...
}
这样,函数签名中的任何拼写错误都将被检测到编译器。
您应该始终尝试最小化类上的方法。如果可以根据类而不是在类中实现功能,则应这样做。换句话说,如果您可以通过使用已发布的公共接口来实现所需的功能,那么您应该这样做。这大大减少了代码对实现细节的依赖。
因此,如果您可以在类外部的适当命名空间中实现它,该命名空间自然与类相关。
编辑:看起来OP实际上是在询问是否实现命名空间或静态类作为实用程序/相关函数的持有者对象。在我看来,命名空间是执行此操作的正确方法,因为这就是它们的目的。类不是必需的。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 何时使用按位运算而不是算术替代方法?
- C++编译器何时推断 no,除了方法?
- 使用信号检测子进程何时终止的最佳方法是什么?
- inotify 的替代方法,用于检测何时在文件夹下创建新文件
- 如果未在本机方法中创建,何时清除本地引用
- 何时使用 CallNonvirtualObjectMethod 及其相关方法
- 有什么方法可以判断分叉/执行Qt应用程序的主窗口何时显示?
- 何时在带有头文件和目标文件的类方法中使用“inline”关键字
- OpenGL:多种渲染方法.何时使用哪个
- C++何时将方法放在类之外
- 什么是静态方法?如何以及何时使用它们
- 何时实例化类模板的 vitual 方法
- 检测QWidget何时失去焦点的可靠方法
- 虚拟方法何时应该是纯方法
- 何时适合使用虚拟方法