在以下代码中
#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前添加了星号,但还没有成功,请告诉我如何纠正它?
答案 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 /将数据添加到树时,将添加节点 - 但空树将保持完全:空。