My code produces a segmentation fault. I was hoping someone could analyze my code and alert me how to avoid causing it. I have a generic TreeItem, everything extends it in order for a Tree to contain integers, doubles, strings, and Tree's themselves. Thanks
Code:#include <iostream> #include <sstream> #include <string> #include <typeinfo> using namespace std; //Abstract class for entire hierarchy class TreeItem { public: virtual string toString()=0; virtual ~TreeItem(); }; //need here because one of the classes uses a node class Node { private: TreeItem *value; Node *left; Node *right; public: //Constructors Node( TreeItem *value ); Node(); //Accessors TreeItem* getValue(); //fetch the data Node* getLeft(); Node* getRight(); //Mutators void setRight( Node* right ); void setLeft( Node* left ); //Other class functions void insert( TreeItem *value ); double total(); string toString(); string print(); //used for tree's }; //Subclass (A string) class StringTreeItem : public TreeItem { private: string value; public: StringTreeItem( string value ); string toString(); }; //Subclass (A tree) class ActualTreeItem : public TreeItem { private: Node *root; public: ActualTreeItem(); double total(); string toString(); void insert( TreeItem *value ); }; //Abstract subclass for numeric value hiearchy //Subclass Hierarchy class NumericTreeItem : public TreeItem { public: virtual ~NumericTreeItem(); }; class FloatTreeItem : public NumericTreeItem { private: double value; public: FloatTreeItem( double value ); double getValue(); string toString(); }; class IntTreeItem : public NumericTreeItem { private: int value; public: IntTreeItem( int value ); int getValue(); string toString(); }; //End subclass hierarchy //End Entire Hiearchy //Class Methods //TreeItem TreeItem::~TreeItem(){} //StringTreeItem StringTreeItem::StringTreeItem( string value ) { this->value = value; } string StringTreeItem::toString() { return value; //already a string } //ActualTreeItem //null constructor ActualTreeItem::ActualTreeItem() { root = NULL; } //need to change/fix, for now its just a dummy method string ActualTreeItem::toString() { string result = "\nempty list"; if( root != NULL ) { result = root->print(); } return result; } double ActualTreeItem::total() { double result; //need to find the total of all numeric value in current list, //ignoring strings and other trees stored as data if( root != NULL ) { result = root->total(); } return result; } //fix this code void ActualTreeItem::insert( TreeItem *value ) { //Do ordered inserts if( root == NULL ) { root = new Node( value ); } else { root->insert( value ); //recursive insert } } //NumericTreeItem NumericTreeItem::~NumericTreeItem(){} //IntTreeItem ////constructor IntTreeItem::IntTreeItem( int value ) { this->value = value; } int IntTreeItem::getValue() { return value; } string IntTreeItem::toString() { stringstream stream; string retValue; //do conversion stream << value; stream >> retValue; return retValue; } //FloatTreeItem //constructor FloatTreeItem::FloatTreeItem( double value ) { this->value = value; } double FloatTreeItem::getValue() { return value; } string FloatTreeItem::toString() { stringstream stream; string retValue; //do conversion stream << value; stream >> retValue; return retValue; } //Node //constructor Node::Node( TreeItem *value ) { this->value = value; this->left = NULL; this->right = NULL; } Node::Node() { this->value = NULL; this->left = NULL; this->right = NULL; } TreeItem* Node::getValue() { return value; } Node* Node::getLeft() { return left; } Node* Node::getRight() { return right; } void Node::setLeft( Node* left ) { this->left = left; } void Node::setRight( Node* right ) { this->right = right; } void Node::insert( TreeItem *value ) { //code here if( value != NULL ) { if( value->toString() < this->toString() ) { if( this->getLeft() == NULL ) { this->setLeft( new Node( value ) ); //need &?? or is this expression ok? } else { this->getLeft()->insert( value ); } } else if( value->toString() > this->toString() ) { if( this->getRight() == NULL ) { this->setRight( new Node( value ) ); } else { this->getRight()->insert( value ); } } //if identical, do nothing...no duplicate inserts } } double Node::total() { double result = 0; if( this->getLeft() != NULL ) { result += this->getLeft()->total(); //it gets added } try { result += (double)( ( dynamic_cast<IntTreeItem*>( this->getValue() ) )->getValue() ); //cast TreeItem down to IntTreeItem, envoke it's value method, then convert to double throw 1; } catch( int i ) { //do nothing } try { result += ( ( dynamic_cast<FloatTreeItem*>( this->getValue() ) )->getValue() ); //cast TreeItem down to FloatTreeItem, envoke it's value method (which gives a double) throw 1; } catch( int i ) { //do nothing } if( this->getRight() != NULL ) { result += this->getRight()->total(); //it gets added } return result; } string Node::toString() { return this->getValue()->toString(); } //only called by tree's string Node::print() { string result = "<"; //probably need formatting if( this->getLeft() != NULL ) { result += "<"; result += this->getLeft()->print(); } else { result += "<>"; } result += this->getValue()->toString(); if( this->getRight() != NULL ) { result += ">"; result += this->getRight()->print(); } else { result += "<>"; } return result; } //End Class Methods int main () { ActualTreeItem BinaryTree1, BinaryTree2; BinaryTree1.insert( new IntTreeItem( 10 ) ); BinaryTree1.insert( new FloatTreeItem( 5.5 ) ); BinaryTree1.insert( new StringTreeItem( "Ralph" ) ); BinaryTree1.insert( new StringTreeItem( "Alice" ) ); BinaryTree1.insert( new IntTreeItem( 20 ) ); BinaryTree1.insert( new IntTreeItem( 30 ) ); BinaryTree1.insert( new StringTreeItem( "Ed" ) ); cout << BinaryTree1.toString(); cout << "\nTotal: "; cout << BinaryTree1.total(); BinaryTree2.insert( &BinaryTree1 ); BinaryTree2.insert( new StringTreeItem( "Ralph" ) ); BinaryTree2.insert( new IntTreeItem( 1 ) ); BinaryTree2.insert( new StringTreeItem( "Ed" ) ); BinaryTree2.insert( new FloatTreeItem( 99.5 ) ); cout << BinaryTree2.toString(); cout << "\nTotal: "; cout << BinaryTree2.total(); delete cout << "\n\nEnd processing...\n"; return (1); }


