在类构造函数问题中从文件加载失败

时间:2013-10-29 10:35:02

标签: c++ constructor segmentation-fault

我正在尝试在A类构造函数中添加选项以从文件加载对象。但是我不确定加载失败时要做什么(文件加载失败,文件格式错误......)。代码使用A,无论loadObjects是否为true,都会导致分段错误。也许加载构造函数不是最好的方法......

template <typename T>
class A
{
    public:
        A(const std::vector<Obj<T>*>& o) : objs(o) {}

        A(const std::string& file)
        {
            // loadObject adds new objects in objs
            // objs.push_back(new Obj<T>);
            if ( loadObjects(file, objs) ) 
            {
                // good, can use object A
            }
            else
            {
                // Segmentation fault when using undefined A, 
                // What can I do to stop execution here.
            }

        }

        virtual ~A()
        {
            for (size_t i=0; i<objs.size(); ++i)
                delete objs[i];
            objs.clear();
        }

    private:
        std::vector<Obj<T>*> objs;

};

2 个答案:

答案 0 :(得分:1)

只需使用throw即可。在这种情况下不会创建对象,您可以在另一级别捕获异常。

答案 1 :(得分:1)

创建一个函数initialize(),您可以在其中加载文件,然后在A的构造函数中调用它。此外,在使用A类对象之前,请验证此对象。因此,在这种情况下,之后的操作将不会继续。

    A::A(const std::string& file)
    {
        if (initialize(const std::string& file) == SUCCESS)
            ....
        else
            ....
    }

    void A::initialize(const std::string& file)
    {
        if ( loadObjects(file, objs) ) 
        {
            // good, can use object A
        }
        else
        {
            // Segmentation fault when using undefined A, 
            // What can I do to stop execution here.
        }
    }

然后使用A的对象。

    A obj("abc.txt");

    if (obj is valid)
        do something;
    else
        return;