说,我想创建一个File类
class File{
public:
File(const char *file){
openFile(file);
}
~File();
isEmpty();
};
openFile检查文件是否存在或文件内容是否有效。
File *file = new File("filepath");
if(file)
file->isEmpty();
如果我的文件路径是正确的,那么所有正常的文件实例都是正确的,我们可以调用file->isEmpty();
什么是不存在的文件,在这种情况下,检查if(file)
仍然会计算为true,并将导致创建实际上无效的文件实例。我如何保证如果文件路径无效,文件实例应该为空。
答案 0 :(得分:6)
如果无法打开文件,构造函数应抛出异常。
File::File( const char* pPath )
{
if ( !openFile( pPath ) )
throw FileNotFound( pPath );
}
答案 1 :(得分:1)
在构造函数中进行检查的唯一方法是抛出异常。但这不算是好的设计 - 你应该创建它,检查它是否有效,如果不是则删除它。
答案 2 :(得分:1)
我建议使用静态工厂方法对您进行检查,如果对象无效,则删除它并引发异常。您可以像这样创建文件:
File* file = File::open("whatever");
答案 3 :(得分:0)
如果我理解你的错误,你想在"filepath"
无效时从构造函数返回null吗?尽管存在一些可能性,但在C ++中这不是(直接)可能的。您可以从构造函数中抛出异常,但这在C ++中会变得很毛躁。您可以使用一些可以检查File对象有效性的函数,因此if(file)
将成为if(isValid(file))
。您还可以将某些逻辑包装在某种工厂中,如果要创建的文件无效,它将返回null。
答案 4 :(得分:0)
我会使用STL,模板并抛出一个空类。现在,你不能从构造函数返回任何东西......所以要么做这样的事情:
#include <string>
using std::basic_string;
class EmptyFile{};
template<typename T>
class File
{
public:
File(const basic_string<T> &FILE)
{
if (isEmpty(FILE)) throw EmptyFile();
openFile(FILE);
}
bool isEmpty(const basic_string<T> &FILE) const
{ return FILE.empty(); }
};
或者你可以这样做:
#include <string>
using std::basic_string;
template<typename T>
class File
{
public:
bool Open(const basic_string<T> &FILE) const
{
bool empty = isEmpty(FILE);
if(!empty)
/* open the file */;
return isEmpty;
}
bool isEmpty(const basic_string<T> &FILE) const
{ return FILE.empty(); }
};