-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 の例であり、ルートの前にアスタリスクを追加しましたが、まだ成功していません。修正方法を教えてください。

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場合、このようにインプレース初期化を行うことができます。変数には静的な期間 (ライフタイム) があるためです。これは global の定義とほとんど同じですが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) {}
};

...そして、ツリーにデータを追加するとき/場合/としてノードが追加されますが、空のツリーはそのまま残ります。つまり、空です。

于 2012-04-29T20:54:58.300 に答える