c++ - 全局函数还是私有成员函数?

查看:131
本文介绍了c++ - 全局函数还是私有成员函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

实现一个类的时候,有个时候需要用到一些公共的函数,这些函数不依赖类的成员变量,这些函数应该放在同文件里面作为全局函数还是放到头文件中作为私有成员函数?
例如:
对于一个配置文件读取类,需要一个函数将读取的颜色字符串"#aabbcc"转换成结构体Color{ float r,g,b;};
私有成员版本:

// loader.h
class Loader{
public:
    void foo();
private:
    Color StringToColor(std::string s){...}    // private version
};
// loader.cpp
void Loader::foo()
{
    ...
    Color c = StringToColor(s);
}

同文件的全局函数版本:

// loader.cpp
Color StringToColor(std::string s){...}    // global version
void Loader::foo()
{
    ...
    Color c = StringToColor(s);
}

如果用私有成员版本,可能会导致头文件膨胀,特别是这些函数要用到某些库函数的时候,需要将库文件包含到头文件中。
如果用全局函数版本,好像不怎么OOP。一般来说,哪种实现更好呢?

解决方案

不必为了OOPOOP啊,C++本来就不只有OOP一种范式啊,除非你们公司有规范必须遵守

如果你确定StringToColor只是Loader的一个辅助函数,而且不依赖类的内部变量,可以定义在匿名命名空间里

// loader.cpp
namespace
{
    Color StringToColor(std::string s){...}
}

void Loader::foo()
{   ...
    Color c = StringToColor(s);
}

这样StringToColor就只在Loader.cpp内部可见了,不会暴露到全局

如果不熟悉命名空间,还可以沿用Cstatic概念,把StringToColor定义成静态,不过这种写法不推荐:

// loader.cpp
static Color StringToColor(std::string s){...}

void Loader::foo()
{   ...
    Color c = StringToColor(s);
}

也可以起到仅在loader.cpp内部可见的作用

这篇关于c++ - 全局函数还是私有成员函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆