所以,假设我有一些函数来处理文件的打开/关闭。
使用静态声明的所有这些函数创建一个类是否更好? 或者只是将“public”函数放在命名空间“file”的头文件中,并将其余的“实现细节”放在.cc文件中?
以下是代码示例。
命名空间一有点长,因为我想让它尽可能清晰。
谢谢!
类实现
部首:
#ifndef FILE_H
#define FILE_H
#include <iostream>
#include <fstream>
include "common.h"
enum Errorcode {
FILE_CANNOT_OPEN,
FILE_CANNOT_CLOSE
};
class file {
public:
static common::Lines toLines(std::string filename);
private:
static void err(Errorcode e, std::string msg);
static void toLines(std::ifstream &ifs, common::Lines &lines);
};
#endif
.cc文件:
/*just the implementation details of above class.*/
命名空间实现
部首:
#ifndef FILE_H
#define FILE_H
#include <iostream>
#include <fstream>
#include "common.h"
namespace file {
common::Lines toLines(std::string filename);
}
#endif
.cc文件:
namespace file {
enum Errorcode {
FILE_CANNOT_OPEN,
FILE_CANNOT_CLOSE
};
void err(Errorcode e, std::string msg);
void toLines(std::ifstream& ifs, common::Lines &lines);
common::Lines toLines(std::string filename)
{
std::vector<std::string> lines;
try {
std::ifstream ifs(filename.c_str());
if (ifs.fail()) throw FILE_CANNOT_OPEN;
toLines(ifs, lines);
ifs.close();
if (ifs.fail()) throw FILE_CANNOT_CLOSE;
}
catch (Errorcode e) {
err(e, filename);
}
return lines;
}
void err(Errorcode e, std::string msg)
{
switch (e) {
default:
std::cerr << "Unknown error.\n";
break;
case FILE_CANNOT_OPEN:
std::cerr << "file \"" << msg
<< "\" could not be opened.\n";
break;
case FILE_CANNOT_CLOSE:
std::cerr << "file \"" << msg
<< "\" could not be closed.\n";
break;
}
std::exit(-1);
}
void toLines(std::ifstream& ifs, common::Lines &lines)
{
std::string line;
while(std::getline(ifs, line)) {
lines.push_back(line);
}
ifs.clear(); // clear error bit set by getline()
}
}
答案 0 :(得分:11)
从表面上看,静态类函数和命名空间函数几乎完全相同,事实上,在命名空间支持普及之前的早期阶段就使用了类。
如今,你应该做最能表达你的程序的逻辑结构(即心理模型)的东西。如果要对相关函数进行分组,则它是命名空间。
然而,简而言之,技术差异在于命名空间参与依赖于参数的查找(ADL),而类成员函数则不参与,但是类可以转换为模板和专用。如果这些语义差异中的任何一个对您很重要,那么这种考虑可能会帮助您做出正确的选择。
答案 1 :(得分:5)
有一个简单的问题涵盖了大多数的情况:如果你把它变成了一个类,那个类的实例是否有意义并完成一些有用的东西?
如果实例有用,那么您需要一个类。否则,命名空间可能是更好的选择。
答案 2 :(得分:-1)
随着oop变得越来越流行,当你只用一个程序员开发一个小项目时,Class是一个更好的选择。 在开发复杂的应用程序时,更好地结合类和命名空间。