0

ノード クラスでノード配列を初期化しようとしています。これらはプライベート メンバーです。

    #include<iostream>
    #include<string>
    using namespace std;
    class Data
    {
    public:
        long data;
        Data(long dd)
        {
            data=dd;
        }
        void displaydata()
        {
            cout<<data <<"  "<<endl;
        }
    };
    class node
    {
//these are what i have changed
        const static int order=4;
        int numitems;
        node *parent;


    vector<node>childarray(order);
        vector<Data>itemarray(order-1);

    };

残念ながら、コンパイルされません。エラーは次のとおりです。

  1>c:\users\dato\documents\visual studio 2010\projects\234_tree\234_tree\234_tree.cpp(26): error C2061: syntax error : identifier 'order'
    1>c:\users\dato\documents\visual studio 2010\projects\234_tree\234_tree\234_tree.cpp(27): error C2061: syntax error : identifier 'order'
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

次のJavaコードから。

class DataItem
{
public long dData; // one data item
//--------------------------------------------------------------
public DataItem(long dd) // constructor
{ dData = dd; }
//--------------------------------------------------------------
public void displayItem() // display item, format “/27”
{ System.out.print(“/”+dData); }
//--------------------------------------------------------------
} // end class DataItem
////////////////////////////////////////////////////////////////
class Node
{
private static final int ORDER = 4;
private int numItems;
private Node parent;
private Node childArray[] = new Node[ORDER];
private DataItem itemArray[] = new DataItem[ORDER-1];
// -------------------------------------------------------------
// connect child to this node
public void connectChild(int childNum, Node child)
{
childArray[childNum] = child;
if(child != null)
child.parent = this;
}
// -------------------------------------------------------------
// disconnect child from this node, return it
public Node disconnectChild(int childNum)
{
Node tempNode = childArray[childNum];
childArray[childNum] = null;
return tempNode;
}
// -------------------------------------------------------------
public Node getChild(int childNum)
{ return childArray[childNum]; }
// -------------------------------------------------------------
public Node getParent()
{ return parent; }
// -------------------------------------------------------------
public boolean isLeaf()
Java Code for a 2-3-4 Tree 479
LISTING 10.1 Continued
{ return (childArray[0]==null) ? true : false; }
// -------------------------------------------------------------
public int getNumItems()
{ return numItems; }
// -------------------------------------------------------------
public DataItem getItem(int index) // get DataItem at index
{ return itemArray[index]; }
// -------------------------------------------------------------
public boolean isFull()
{ return (numItems==ORDER-1) ? true : false; }
// -------------------------------------------------------------
public int findItem(long key) // return index of
{ // item (within node)
for(int j=0; j<ORDER-1; j++) // if found,
{ // otherwise,
if(itemArray[j] == null) // return -1
break;
else if(itemArray[j].dData == key)
return j;
}
return -1;
} // end findItem
// -------------------------------------------------------------
public int insertItem(DataItem newItem)
{
// assumes node is not full
numItems++; // will add new item
long newKey = newItem.dData; // key of new item
for(int j=ORDER-2; j>=0; j--) // start on right,
{ // examine items
if(itemArray[j] == null) // if item null,
continue; // go left one cell
else // not null,
{ // get its key
long itsKey = itemArray[j].dData;
if(newKey < itsKey) // if it’s bigger
itemArray[j+1] = itemArray[j]; // shift it right
else
{
itemArray[j+1] = newItem; // insert new item

コードを簡単に変換するのを手伝ってください。注文をパブリックとして宣言する必要がありますか? const int node::order=4 のように、クラス外で順序の宣言も試みましたが、まだ成功していません。何が問題なのですか? メンバーを保持する配列が必要です。サイズは順序または 4 である必要があります。本を読んでいるときに、この本から C++ で Java コードを書いているときに必要なものを著者が言っていました。ポインターと書かれているので、ポインターを追加しましたが、まだ成功していません。

4

1 に答える 1

1

台詞

node *childarray[]=new node[order];
Data *itemarray[]=new Data[order-1];

ここでエラーになっています。クラスでこのように割り当てることができないことに加えて、宣言も間違っています。たとえば、ポインターの配列であると宣言しchildarrayていますが、単純な配列として作成しています。宣言を次のように変更します

node *childarray;
Data *itemarray;

実際に割り当てを行うには、コンストラクターで行う必要があります。

std::arrayただし、代わりに(または場合によっては )を使用することをお勧めしますstd::vector

編集:使用std::array

struct node
{
    static const int ORDER = 4;
    int numitems;
    node* parent;
    std::array<node*, ORDER> childarray;
    std::array<Data*, ORDER - 1> itemarray;

    node()
        : numitems{0},
          parent{nullptr},
          childarray{{nullptr}},
          itemarray{{nullptr}}
        { }
};

現在childarray、 とは (それぞれ)および(それぞれ) 数のポインターitemarrayを持つ配列であり、すべて初期化されています(今あるべきもの)。ORDERORDER - 1nullptrNULL

于 2012-09-07T06:17:40.317 に答える