Home > Net >  Cannot implement array initialization in TreeNode Template C Scapegoat Tree
Cannot implement array initialization in TreeNode Template C Scapegoat Tree

Time:12-15

I get an initialization error for a TreeNode class constructor… This is the function: TreeNode* a = new TreeNodens; Is the issue here, not sure what I have to add to TreeNode but it needs some type of tweak!

template <typename T>
void ScapegoatST<T>::rebuild(TreeNode<T>* node){
    int ns = getHeight(node);
    TreeNode<T>* p = node->getParent();
    TreeNode<T>* a  = new TreeNode<T>[ns]();
    TreeNode<T>* r;
    
    packintoArray(node,a,0);
    if (p == NULL){
        r = buildBalanced(a,0,ns);
        r->setParent(NULL);
    } else if (p->getRight() == node){
        TreeNode<T>* Tr = buildBalanced(a, 0, ns);
        p->setRight(Tr);
        p->getRight()->setParent(p);
    } else {
        p->setLeft(buildBalanced(a,0,ns));
        p->getLeft()->setParent(p);
    }
    
}

Here is the TreeNode.h:

#ifndef TREE_NODE_H
#define TREE_NODE_H

#include <cstdlib>
#include <iostream>
using namespace std;

template <typename T>
class TreeNode{
public:
    TreeNode(T nData);
    virtual ~TreeNode();
    
    T getData();
    TreeNode<T>* getLeft();
    TreeNode<T>* getRight();
    TreeNode<T>* getParent();
    
    void setData(T nData);
    void setLeft(TreeNode<T>* nleft){left=nleft;};
    void setRight(TreeNode<T>* nright){right=nright;};
    void setParent(TreeNode<T>* nparent){parent=nparent;};
    
    template <typename S>
    friend class ScapegoatST;
    
private:
    T data;
    TreeNode<T>* left;
    TreeNode<T>* right;
    TreeNode<T>* parent;
};

template <typename T>
TreeNode<T>::TreeNode(T nData){
    data = nData;
    left = NULL;
    right = NULL;
}

template <typename T>
TreeNode<T>::~TreeNode(){
    delete left;
    delete right;
    delete parent;
    data = NULL;
}

template <typename T>
T TreeNode<T>::getData(){
    return data;
}

template <typename T>
void TreeNode<T>::setData(T nData){
    data = nData;
}

#endif

I tired creating a constructor for the array initialization but it wasn’t successful.

CodePudding user response:

The issue here is that you've created the constructor TreeNode(T nData), which prevents the constructor with no arguments TreeNode() from being generated, but you call that constructor when you do new TreeNode<T>[ns]().

One solution would be to add a constructor TreeNode(), with a body like so:

template<typename T>
TreeNode<T>::TreeNode() {
    left = NULL;
    right = NULL;
}

This will mean that constructing a TreeNode with no nData will result in the node's data field being default-initialized (for primitive types, it will contain an undefined value, and for classes it will act like T() was called to construct the data value).

  • Related