Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 薛西斯。指向DomeElement的动态强制转换DOMNode指针返回nullptr_C++_Xml_Aix_Xerces_Xlc - Fatal编程技术网

C++ 薛西斯。指向DomeElement的动态强制转换DOMNode指针返回nullptr

C++ 薛西斯。指向DomeElement的动态强制转换DOMNode指针返回nullptr,c++,xml,aix,xerces,xlc,C++,Xml,Aix,Xerces,Xlc,你好。问题如下。我有一个有效的*.xml文件,我尝试使用以下代码对其进行解析: for(XMLSize_t i = 0; i < childrenNodeCount; ++i) { DOMNode* currentNode = children->item(i); if ((currentNode->getNodeType() != 0) && (currentNode->getNodeType() == DOMNode::ELEMENT_NOD

你好。问题如下。我有一个有效的*.xml文件,我尝试使用以下代码对其进行解析:

for(XMLSize_t i = 0; i < childrenNodeCount; ++i)
{
  DOMNode* currentNode = children->item(i);

  if ((currentNode->getNodeType() != 0) && (currentNode->getNodeType() == DOMNode::ELEMENT_NODE))
  {
    DOMElement* currentElement = dynamic_cast<xercesc::DOMElement*>(currentNode); // !!!

    if (XMLString::equals(currentElement->getTagName(), TAG_SectionHeader))
    {
      // parse this part
    }

    if (XMLString::equals(currentElement->getTagName(), TAG_SectionBody))
    {
      // parse this part
    }
  }
}
for(XMLSize\u t i=0;i项(i);
if((currentNode->getNodeType()!=0)&&(currentNode->getNodeType()==DOMNode::ELEMENT_NODE))
{
DomeElement*currentElement=动态_转换(currentNode);/!!!
if(XMLString::equals(currentElement->getTagName(),TAG_SectionHeader))
{
//解析此部分
}
if(XMLString::equals(currentElement->getTagName(),TAG_SectionBody))
{
//解析此部分
}
}
}
程序在执行过程中崩溃,并在第一次“等于”检查时发出信号。调试表明,在动态强制转换之后,currentElement实际上是一个空指针。这里有什么问题

使用xlc++、Xerces库2.5和AIX7编译

另外,同样的代码显然在Windows上运行良好

更新:将动态\u cast更改为静态\u cast使代码运行时没有错误。然而,它留下了一些问题没有回答

1) 为什么在Windows而不是Unix上使用dynamic_cast时,代码运行时没有错误?可能是编译器或库版本问题


2) 在这种情况下,是否有更好/更干净的强制转换方法?

您没有提到编译器版本或选项,是否指定了-qrti以启用动态强制转换

    -qrtti=<option> | -qnortti
            (C++) Generates runtime type identification (RTTI)
            information for the typeid and dynamic_cast
            operators.  The suboptions are:

            all
                 Generates the information needed for the RTTI
                 typeid and dynamic_cast operators.
            type | typeinfo
                 Generates the information needed for the RTTI
                 typeid operator only.
            dyna | dynamiccast
                 Generates the information needed for the RTTI
                 dynamic_cast operator only.

            Default: -qnortti
-qrti=|-qnortti
(C++)生成运行时类型标识(RTTI)
typeid和动态\u转换的信息
接线员。子选项包括:
全部的
生成RTTI所需的信息
typeid和dynamic\u cast运算符。
类型|类型信息
生成RTTI所需的信息
仅限typeid运算符。
dyna | dynamiccast
生成RTTI所需的信息
仅限动态_cast运算符。
默认值:-qnortti

好的,原因如下:Xerces库在默认情况下不是在启用RTTI的情况下构建的。要使OP中的机制正常工作,应在启用RTTI的情况下重建库

currentNode
不是
doElement
。哦和
currentNode->getNodeType()!=0)
完全没有必要。实际上,它是一个DOMNode指针。这正是重点。我正在尝试对派生类指针进行转换。
dynamic\u cast
在无法执行转换时返回null。由于
currentNode
不是
doElement
,因此转换失败并返回null。当
currentNode
不是
doElement
并且使用
static\u cast
时,结果是未定义的行为。任何好的调试器都会告诉您currentNode的真正类型。@CaptainObvlious,ok。所以情况如下:DOMNode是DOMElement的父级。这两个类都是纯虚拟的。我用来构造代码的xerces示例使用动态强制转换。即使这样做了,我该怎么办?是的,rtti已启用。