2012-04-29 3 views
-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(); 


}; 

он говорит, что член данных инициализатор не допускается, корневого узла = новый узел() это пример, в Java, и я добавил звездочки в передней части корня, но пока не получилось, пожалуйста, скажите мне, как его исправить?

+4

Исправьте свои отступы и пробелы, пожалуйста, уменьшите это до [минимального тестового примера] (http://sscce.org). –

+2

И * пожалуйста * не пишите код как 'return (a == b)? True: false;', 'return a == b' более чем достаточно ... – zmbq

+1

Возможный дубликат: http: // stackoverflow.com/questions/8782440/why-am-i-get-an-error-when-declaring-a-variable-in-a-class-declaration-withi – Cratylus

ответ

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) {} 
}; 

... и будут добавлены узлы, когда/если/как вы добавить данные дерево - но пустое дерево останется именно таким: пустым.

+0

не работает, это значит, что я должен ответить на этот вопрос? –

+1

@dato: Что вы подразумеваете под «ни одной работой»? Я уже проверил, и код (измененный, как я указал) компилируется как с VC++ 10, так и с g ++ 4.7. Если у вас все еще есть проблема, вам, вероятно, нужно быть немного более конкретным, чем «ни одна работа», и указать на точную проблему, с которой вы сталкиваетесь. –

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()} 
}; 
2

Вы не можете инициализировать переменные-члены, как, что: инициализирует их в конструкторе или застройщика, список инициализаторов.

В C++ 03 только static const элементы интегрального типа могут быть инициализированы следующим образом. Я думаю, что в C++ 11 это было расширено, но я не уверен в деталях.

+0

В C++ 11 вы можете инициализировать * нестатические * элементы данных в точке объявления. – juanchopanza

+0

@juanchopanza, существуют ли какие-либо ограничения? – hmjd

+0

Не то, чтобы я знал. – juanchopanza

Смежные вопросы