我该如何处理C ++中的不一致对象?

时间:2009-11-21 22:20:56

标签: c++

说,我想创建一个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,并将导致创建实际上无效的文件实例。我如何保证如果文件路径无效,文件实例应该为空。

5 个答案:

答案 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(); }
};