最好使一个类静态地声明所有这些功能
或者简单地将“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()}}解决方法 表面上,静态类函数和命名空间函数几乎是相同的,事实上,在名字空间支持普及之前的早期阶段就使用了类.
如今,您应该最能表达程序的逻辑结构(即心理模型).如果您正在对相关函数进行分组,那么它是一个命名空间.
然而,技术上的差异在于命名空间参与参数相关查找(ADL),而类成员函数不能,但是类可以转换为模板和专门的.如果任何这些语义差异对您很重要,那么这个考虑可能会帮助您做出正确的选择.
总结以上是内存溢出为你收集整理的c – 命名空间或类,它只适用于封装功能成员全部内容,希望文章能够帮你解决c – 命名空间或类,它只适用于封装功能成员所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)