0

私はC++プログラムでRapidXmlを使用しています。大丈夫、問題ありません。変数値の代わりにポインターを使用しなければならない理由がわかりません...RapidXmlwikiページを見ると、いくつかの例が提供されています。これは、RapidXml開発者によって提供されたものです。

#include <iostream>
#include <string>
#include "rapidxml-1.13/rapidxml.hpp"
#include "rapidxml-1.13/rapidxml_print.hpp"
int main(int argc, char** argv);
int main(int argc, char** argv) {
    using namespace rapidxml;
    xml_document<> doc;
    // xml declaration
    xml_node<>* decl = doc.allocate_node(node_declaration);
    decl->append_attribute(doc.allocate_attribute("version", "1.0"));
    decl->append_attribute(doc.allocate_attribute("encoding", "utf-8"));
    doc.append_node(decl);
    // root node
    xml_node<>* root = doc.allocate_node(node_element, "rootnode");
    root->append_attribute(doc.allocate_attribute("version", "1.0"));
    root->append_attribute(doc.allocate_attribute("type", "example"));
    doc.append_node(root);
    // child node
    xml_node<>* child = doc.allocate_node(node_element, "childnode");
    root->append_node(child);
    xml_node<>* child2 = doc.allocate_node(node_element, "childnode");
    root->append_node(child2);
    std::string xml_as_string;
    // watch for name collisions here, print() is a very common function name!
    print(std::back_inserter(xml_as_string), doc);
    std::cout << xml_as_string << std::endl;
    // xml_as_string now contains the XML in string form, indented
    // (in all its angle bracket glory)
    std::string xml_no_indent;
    // print_no_indenting is the only flag that print() knows about
    print(std::back_inserter(xml_no_indent), doc, print_no_indenting);
    // xml_no_indent now contains non-indented XML
    std::cout << xml_no_indent << std::endl;
}

さて、なぜそれはxml_nodeへのポインタを使用するのですか?

xml_nodeを返す関数が必要なので、これを尋ねます...

だから私がこれを行うと:

xml_node <> * mynode = ... return * mynode;

大丈夫ですか??返されたノードとそのすべての子を後で使用したいからです。このようにするのは良いことですか?そうでない場合は、どうすればよいですか?

4

3 に答える 3

3

ポインタを返すことは、おそらくノードのコピーコンストラクタを呼び出さないようにするために行われます。特にノードがすでに内部のどこかに割り当てられていることを考えると、ポインタを返すだけの方が高速です。

参照を返すこともできますが、無効な呼び出しでNULLを返す機能を保持したい場合があります。

xml_nodeが必要な場合は、いつでもポインターを逆参照できます(最初にNULLを確認してください)。ただし、返されたノードとその子を後で本当に使用したい場合は、返されたポインターを->とともに使用し、ポインターを値で渡すのがおそらく最善です。

于 2011-01-12T19:44:12.203 に答える
2

さて、なぜそれはxml_nodeへのポインタを使用するのですか?

おそらく、戻り時にコピーを作成するよりも、ノードへのポインタを返す方が速いためです。

于 2011-01-12T19:33:27.723 に答える
-2

OK ...まあRapidXMLやXercesのような他の多くは値を返さないがポインタを返すので、プログラマーは値を取り込んでコピーを作成することはできません...これはメモリを保持するために行われます...

特にDOMについて話すとき、SAXについてもほとんど同じですが、これらのパーサーは、プログラムが実行されるコンピューターのRAMに非常に複雑なメモリ割り当て構造を作成する必要があります。パフォーマンスなどを提供するために、すべてのコンストラクターとCOPY-CONSTRUCTORSはプライベートです。

ライブラリを見てください...あなたはこの素晴らしいトリックを発見するでしょう。

理由は私が報告したものであり、誰もが私に提案したものです。

c、c ++、および低水準言語を使用する場合、すぐにプログラムする方法ではないと思います...プログラマーはノードを取得して渡すことも、関数やクラスに簡単に戻ることもできません。

于 2011-01-12T20:00:06.517 に答える