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

所以说,我有几个功能来处理文件的打开/关闭.

最好使一个类静态地声明所有这些功能
或者简单地将“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++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...