0

クラス A コンストラクターにオプションを追加して、ファイルからオブジェクトをロードしようとしています。しかし、読み込みに失敗した場合の対処方法がわかりません (ファイルの読み込みに失敗した、ファイル形式が正しくない..)。コードは、loadObjects が true であるかどうかに関係なく A を使用し、セグメンテーション違反につながります。コンストラクターでのロードは最善の方法ではないかもしれません...

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;

};
4

2 に答える 2

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;
于 2013-10-29T11:06:20.093 に答える
1

を使用するだけthrowです。この場合、オブジェクトは作成されず、他のレベルで例外をキャッチできます。

于 2013-10-29T10:44:24.363 に答える