0

第一件事是我真的不想在堆栈代码交换上发布这个,因为这是在大约 5 分钟内编写的非常少量的代码。

我想问你我写的课(我第一次用c++)是否可以接受。我并没有真正看到很多 c++ 代码,所以我无法将它与任何东西进行比较。

但是我见过一些只实现函数声明的类,这些函数的内部写在代码的其他地方。

如果您有什么问题,我正在向您征求任何建议。为什么他们会按照我在上面的段落中描述的那样做?哪一种编码风格更好?

class File {

private:

    FILE *_handler;
    char *_path;
    long _size;

    void setHandler(char *mode)
    {
        this->_handler = fopen(this->_path, mode);
    }

public:

    File(char *path)
    {
        this->_path = path;
    }

    size_t read()
    {
        this->setHandler("r");
        char *buffer = (char*) malloc(sizeof(char)*this->_size);

        return fread(buffer, 1, this->_size, this->_handler);
    }

    void write(char *data)
    {
        this->setHandler("w");
        fputs(data, this->_handler);
    }

    long size()
    {
        if(! sizeof(this->_size) > 0)
        {
            fseek(this->_handler, 0, SEEK_END);
            this->_size = ftell(this->_handler);
            rewind(this->_handler);
        }

        return this->_size;
    }

}; // End File
4

2 回答 2

7

这里存在技术问题以及我认为的基本设计问题。

技术的:

你打开一个文件多少次?你关闭了多少次?看看 read() 和 write() 做了什么。

错误处理在哪里?如果 fopen() 失败会发生什么。切勿在未检查的情况下使用返回值。

基本设计问题:

你分配内存,谁来释放它?将分配和释放的责任分开通常不是一个好主意。C++ 的人倾向于使用智能指针来帮助解决这个问题。

如果给定一个非常大的文件,您的代码会做什么?

最基本的:你的界面是一个“你必须记住这个”的界面。如果有人调用 read() 而不记得先调用 size() 会发生什么?为什么您的呼叫者需要这样做?设计您的界面,旨在简化呼叫者的生活。

于 2013-04-11T20:28:17.623 回答
3

this如果没有歧义,则无需使用。

File(char *path)
{
    _path = path;
}

与您可以删除的功能相同this

size_t read()
{
    setHandler("r");
    char *buffer = (char*) malloc(sizeof(char)*_size);

    return fread(buffer, 1, _size, _handler);
}

在类声明中实现函数有它的用途,但它不是必须的(除非使用模板),你可以在源文件中定义你的函数并从那里包含你的类头文件。这使类实现与类接口分开。

想象一下,您在头文件中更改了一个函数的实现,包括该头文件在内的所有文件,即使它们没有使用该函数,也需要重新编译。

由于您使用的是 C++,因此您可能需要考虑使用 c++ 文件对象(fstream、ifstream、ofstream 等)。

最后,我真的看不出像这样包装文件的意义,除非你的类提供了一些额外的功能,你在这里所做的只是更改函数的名称并创建了另一个抽象层,这并没有带来太多桌子。

于 2013-04-11T20:21:12.880 回答