SAX/DOM IDL -> C++ Mapping / Confused

Glenn R. Kronschnabl grk at arlut.utexas.edu
Thu Feb 12 20:37:59 GMT 1998


Hi,

I was trying to duplicate the SAX/DOM java stuff in C++ (and interface with 
SP).  Now, I am a IDL newbie, but according the DOM spec, Node is defined to 
be just an interface.  In the SAXDOM code that's straightforward since java 
understands interfaces.  HOWEVER, in C++, according to the IDL -> C++ mapping, 
an interface is supposed to be constructed as a ABSTRACT base class using pure 
virtual functions.  The problem is when I try to enumerate over them, I get a 
'can't cast up from a virtual base class' error.  Here is abbreviated source.  
Obviously, I am making a fundamental mistake.  Can some kind person out there 
clue me in?  Thanks.

grk$ g++ n.cc
n.cc: In function `int main()':
n.cc:82: cannot cast up from virtual baseclass `Node'

----- cut here ---
#include <list>
#include <string>

class NodeList;
class NodeEnumerator;

class Node {
  enum NodeType {DOCUMENT, ELEMENT};
public:
  virtual NodeType getNodeType() = 0;
  virtual Node* getParentNode() = 0;
  virtual NodeList* getChildren() = 0;
};

class Element : public virtual Node {
 public:
  virtual string getTagName() = 0;
  virtual NodeEnumerator* getElementsByTagName() = 0;
 };

class SaxNode : public virtual Node {
  public:
   NodeType type;
   Node* parent;
   NodeList* children;

  virtual NodeType getNodeType() { return type; }
  virtual Node* getParentNode() { return parent; }
  virtual NodeList* getChildren() { return children; }
 };

class SaxElement : public virtual Node, public Element, public SaxNode {
 public:
  string tagName;
  virtual NodeEnumerator* getElementsByTagName() { }
  virtual string getTagName() { return string("SaxElement"); }
 };

class NodeList {
 public:
  virtual NodeEnumerator* getEnumerator() = 0;
 };

class SaxNodeEnumerator;

class SaxNodeList: public list<SaxNode*>, public NodeList {
 public:
  virtual NodeEnumerator* getEnumerator() { }
};

class NodeEnumerator {
 public:
  virtual Node* getFirst() = 0;
};

class SaxNodeEnumerator : public NodeEnumerator {
 public:
  Node* getFirst() { }
  
};

main()
{

  SaxElement se;

  SaxNodeList* list = (SaxNodeList*) se.getChildren();

  SaxNodeList::iterator snode = list->begin();

  for (; snode != list->end(); ++snode)
  {
    (*snode)->getNodeType(); 

    SaxElement* elem = (SaxElement*) (*snode);

    elem->getTagName();

    SaxNodeEnumerator* e2 = (SaxNodeEnumerator*) elem->getElementsByTagName();

    SaxNode* s2 = (SaxNode*) e2->getFirst();

//    SaxNode snode = (SaxNode*) (*node);
//    cout << node->getNodeType() << endl;
  }

}
--- cut here ----

Cheers,
Glenn                                  
--------------------
Glenn R. Kronschnabl
Applied Research Laboratories        | grk at arlut.utexas.edu (PGP/MIME ok)
The University of Texas at Austin    | http://www.arlut.utexas.edu/~grk
PO Box 8029, Austin, TX 78713-8029   | (Ph) 512.835.3642 (FAX) 512.835.3808
10,000 Burnet Road, Austin, TX 78758 | ... but an Aggie at heart!





xml-dev: A list for W3C XML Developers. To post, mailto:xml-dev at ic.ac.uk
Archived as: http://www.lists.ic.ac.uk/hypermail/xml-dev/
To (un)subscribe, mailto:majordomo at ic.ac.uk the following message;
(un)subscribe xml-dev
To subscribe to the digests, mailto:majordomo at ic.ac.uk the following message;
subscribe xml-dev-digest
List coordinator, Henry Rzepa (mailto:rzepa at ic.ac.uk)




More information about the Xml-dev mailing list