c – 命名空间或类,它只适用于封装功能成员

c – 命名空间或类,它只适用于封装功能成员,第1张

概述所以说,我有几个功能来处理文件的打开/关闭. 最好使一个类静态地声明所有这些功能 或者简单地将“public”函数放在命名空间“file”的头文件中,并将其他“实现细节”放在.cc文件中? 以下是代码示例. 对于命名空间来说,这是一个很长的时间,因为我想尽可能的清楚. 谢谢!! 课程实施 标题: #ifndef FILE_H#define FILE_H#include <iostream> 所以说,我有几个功能来处理文件的打开/关闭.

最好使一个类静态地声明所有这些功能
或者简单地将“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 – 命名空间或类,它只适用于封装功能成员所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1257237.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存