问题描述
实现一个类的时候,有个时候需要用到一些公共的函数,这些函数不依赖类的成员变量,这些函数应该放在同文件里面作为全局函数还是放到头文件中作为私有成员函数?例如:对于一个配置文件读取类,需要一个函数将读取的颜色字符串'#aabbcc'转换成结构体Color{ float r,g,b;};私有成员版本:
// loader.hclass Loader{public: void foo();private: Color StringToColor(std::string s){...} // private version};// loader.cppvoid Loader::foo(){ ... Color c = StringToColor(s);}
同文件的全局函数版本:
// loader.cppColor StringToColor(std::string s){...} // global versionvoid Loader::foo(){ ... Color c = StringToColor(s);}
如果用私有成员版本,可能会导致头文件膨胀,特别是这些函数要用到某些库函数的时候,需要将库文件包含到头文件中。如果用全局函数版本,好像不怎么OOP。一般来说,哪种实现更好呢?
问题解答
回答1:不必为了OOP而OOP啊,C++本来就不只有OOP一种范式啊,除非你们公司有规范必须遵守
如果你确定StringToColor只是Loader的一个辅助函数,而且不依赖类的内部变量,可以定义在匿名命名空间里
// loader.cppnamespace{ Color StringToColor(std::string s){...}}void Loader::foo(){ ... Color c = StringToColor(s);}
这样StringToColor就只在Loader.cpp内部可见了,不会暴露到全局
如果不熟悉命名空间,还可以沿用C的static概念,把StringToColor定义成静态,不过这种写法不推荐:
// loader.cppstatic Color StringToColor(std::string s){...}void Loader::foo(){ ... Color c = StringToColor(s);}
也可以起到仅在loader.cpp内部可见的作用

