首先,我并不是真的想在堆栈代码交换上发布这个,因为这是在大约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
答案 0 :(得分:7)
这里存在技术问题以及我认为的基本设计问题。
技术:
您打开文件多少次?你关闭一次多少次?看看read()和write()做什么。
错误处理在哪里?如果fopen()失败会发生什么。切勿在未经检查的情况下使用返回值。
基本设计问题:
你分配内存,谁释放它?分配和释放责任通常是一个坏主意。 C ++人倾向于使用智能指针来帮助解决这个问题。
如果给出一个非常大的文件,你的代码会做什么?
最基本的:你的界面是“你必须记住这个”界面。如果有人在不记得首先调用size()的情况下调用read()会发生什么?为什么你的来电者需要这样做?设计您的界面的目的是让您的来电者的生活变得简单。
答案 1 :(得分: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等)。
最后我并没有真正看到包装这样的文件的重点,除非你的类提供了一些额外的功能,你在这里所做的只是更改函数的名称并创建另一层抽象而不带来在桌子上。