-3

在下面的代码中

#include<iostream>
#include<cstring>
using namespace std;
class data
{
public:
    long ddata;
    data(long dd)
    {
        ddata=dd;
    }
    void display()
    {
        cout<<ddata<<"  ";
    }
    };
class Node
{
     const  int order=4;
    int numitems;
    Node *parent;
    Node *childarray[order];
    data *item[order-1];
public:
    void connect(int childnum,Node *child)
    {
        childarray[childnum]=child;
        if(child!=NULL)
            child->parent=this;

    }
    //disconetc from this node,return it;

    Node *disconnectchild(int childnum)
    {
        Node *tempnode=childarray[childnum];
        childarray[childnum]=NULL;

     return  (tempnode);
    }
    Node *getchild(int childnum){
        return childarray[childnum];
}
    Node *getparent()
    {

        return parent;
    }
    bool isleaf()
    {
        return (childarray[0]==NULL)?true:false;

    }
    int getnumitems()
    {
        return numitems;
    }
    data *getitem(int index)
    {
        return item[index];
        }
        bool isfull()
    {

        return (numitems==order-1)?true:false;
    }
    int finditem(long key)
    {
        for(int j=0;j<order-1;j++)
        {
            if(item[j]==NULL)
                break;
            else if(item[j]->ddata==key)
                 return j;
            }
    return -1;
        }
    int insertitem(data *newitem)
    {
        numitems++;
        long newkey=newitem->ddata;
        for(int j=order-2;j>=0;j--)
        {
            if(item[j]==NULL)
                continue;
            else
            {
                long itskey=item[j]->ddata;
                if(newkey<itskey)
                    item[j+1]=item[j];
                else
                {
                    item[j+1]=newitem;
                    return j+1;

                }
                            }

        }
        item[0]=newitem;
        return 0;


    }
    data *removeitem()
    {
        data *temp=item[numitems-1];
        item[numitems-1]=NULL;
        numitems--;
        return temp;
        }
    void displayNode()
    {
        for(int j=0;j<numitems;j++)
            item[j]->display();
        cout<<endl;

    }

};

class tree234
{

private:
    Node *root=new Node();


};

它说不允许数据成员初始化程序,Node root = new Node()它是java中的示例,我在root前面添加了星号,但还没有成功,请告诉我如何纠正它?

4

3 回答 3

2

在 C++03 中,您不能像在声明时那样初始化指针。您应该在构造函数中对其进行初始化:

class tree234
{
public :
    tree234() : root(new Node()) {}
private:
    Node* root;
};

在 C++11 中可以这样做

class tree234
{
private:
    Node* root = new Node(); // or Node* root{new Node()}
};
于 2012-04-29T20:44:58.083 回答
2

你不能像这样初始化成员变量:在构造函数或构造函数的初始化列表中初始化它们。

在 C++03 中,只有static const整数类型的成员可以这样初始化。我认为在 C++11 中这已被扩展,但我不确定确切的细节。

于 2012-04-29T20:45:00.473 回答
1

您在几个地方遇到了基本相同的问题,但由于情况不同,它们的修复方法也不同。在代码的第 19 行,您有:

class Node
{
    const  int order=4;    // line 19

由于这显然旨在应用于 的所有实例Node,因此您可以通过使其成为static成员来使其工作:

static const int order = 4;

对于static const变量,您可以像这样进行就地初始化,因为变量具有静态持续时间(生命周期),所以这几乎就像一个全局的定义const,只是它的名称仅在Node的范围内可见。

另一个问题类似:

class tree234
{
private:
    Node *root=new Node();

...但在这种情况下,修复完全不同。在这里,您很明显想root成为一个实例变量——即,您创建的每棵树都需要有自己的根节点。因此,您需要定义一个普通的成员变量(即 not static),并且您需要在构造函数中对其进行初始化:

class tree234
    Node *root;
public:
    tree234() : root(new Node()) {}
};

然而,我注意到,这个初始化看起来……对我来说很可疑。我的直接猜测是,一棵空树可能根本应该包含任何节点,所以初始化应该是:

class tree234
    Node *root;
public:
    tree234() : root(NULL) {}
};

...并且当您向树添加数据时/如果/当您向树添加数据时,将添加节点——但空树将保持不变:空。

于 2012-04-29T20:54:58.300 回答