0

XMLを解析し、ヘルパーを作成する必要があります。私はC++の専門家ではありませんが、実際には7年以上前にcで書いています。だから、私は確認したいと思います、アプローチ、私が使用するものが正しいかどうか:)

1)例外を処理するために、いくつかの単純なヘルパーを実装しました。例えば:

CComPtr<IXMLDOMElement> create_element(CComPtr<IXMLDOMDocument> xml_doc, string element_name) {
    CComPtr<IXMLDOMElement> element;

    HRESULT hr = xml_doc->createElement((BSTR)element_name.c_str(), &element);

    if (FAILED(hr))
        hr_raise("Failed to create XML element '" + element_name + "'", hr);

    return element;
}

次のように使用します。

void SomeClass::SomeMethod() {
    CComPtr<IXMLDOMElement> element = xmlh::create_element(xml_doc, "test");
    //..
    // save xml to file
}

大丈夫ですか?関数の結果としてスマートポインタを返すことはできますか?このアプローチにはリークがありませんか?

2)また、クラスメンバーとしていくつかのスマートポインターを使用します。このような:

class XMLCommand {
    public:
        XMLCommand(std::string str_xml);
        ~XMLCommand(void);
    protected:
        CComPtr<IXMLDOMDocument> xml_doc;
}


XMLCommand::XMLCommand(string str_xml) {
    xml_doc = xmlh::create_xml_doc();
}

// some methods below uses xml_doc

質問は同じです、それは正しく、漏れがありませんか?

ありがとう。

4

1 に答える 1

1

それはうまくいくでしょう。関数からスマートポインタを返す場合、一時的なものが破棄される前に結果が保存されます。create_elementを呼び出すときに結果を保存する限りCComPtr<IXMLDOMElement>、目的の結果が得られます(たとえば、CComPtr<IXMLDOMElement> resElem = create_element(...);最適化されたC ++は、気にしない可能性が非常に高くなります。一時的なものなど、メソッド内のresElem代わりに使用するだけで、プロセスが高速化されます(詳細については、Googleの戻り値の最適化)。elementcreate_element()

後者の場合は、ほとんど教科書のスマートポインタの使用法です。失敗するケースは考えられません。ただし、一般にスマートポインターを使用する場合の危険のひとつは、循環依存関係を認識および/または回避することです。これにより、スマートポインターが含まれているオブジェクトを削除しない可能性があります。

于 2012-08-13T21:34:28.203 に答える