数据成员初始化

时间:2012-04-29 20:35:13

标签: c++ class

在以下代码中

#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前添加了星号,但还没有成功,请告诉我如何纠正它?

3 个答案:

答案 0 :(得分: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()}
};

答案 1 :(得分:2)

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

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

答案 2 :(得分: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成为实例变量 - 即,您创建的每个树都需要拥有自己的根节点。因此,您需要定义一个普通的成员变量(即,不是static),您需要在构造函数中初始化它:

class tree234
    Node *root;
public:
    tree234() : root(new Node()) {}
};
但是,我注意到,这个初始化看起来......对我很怀疑。我的直接猜测是,空树可能根本不包含任何节点,因此初始化应该是:

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

...当/ if /将数据添加到树时,将添加节点 - 但空树将保持完全:空。