построение класса со структурой внутри него c

#c #object #nested-class #internal-class

#c #объект #вложенный класс #внутренний класс

Вопрос:

Итак, у меня есть класс, который содержит структуру внутри своих частных переменных, а внутри этой структуры у меня есть массив, размер которого определяется только после построения класса.

 template <typename T> 
class btree {

  public:
    btree(size_t maxNodeElems);
    ~btree() {}

  private:
    // The details of your implementation go here
    size_t maxNodeElems;
    struct node {

      list <T> elements;
      node lvl[];

    };

};
  

Во-первых, должен ли я сделать его таким node * lvl , и как мне вызывать переменные внутри этой структуры? Это то же самое, что и частная переменная, поэтому всякий раз, когда я использую ее внутри одной из функций, btree class я могу вызвать ее be btree.lvl или это btree->node->lvl или есть специальный способ сделать это?

Кроме того, мой массив должен быть из maxNodeElems 1 , если кто-то может мне помочь, это было бы очень ценно!

Ответ №1:

Вы просто объявляете тип, а не фактический объект этого типа. Вам нужно сделать объявление вашей структуры общедоступным, а объект закрытым:

 template <typename T> 
class btree {

  public:
    btree(size_t maxNodeElems);
    ~btree() {}

    struct node {   // <- this is just a declaration of a private inner-class
      list <T> elements;
      node lvl[];
    };

  private:
    size_t maxNodeElems;
    node*  memberNode;   // <- this is the actual private member

};
  

Вы можете создавать объекты этого типа извне:

 btree<A>::node* n = new btree<A>::node;
  

Для доступа к членам у вас могут быть общедоступные методы получения и установки в вашем классе btree:

 class btree {
public:
   node* getNode()
   {
      return memberNode;
   }
   //...........
   //...........
};
  

Редактировать:

Для меня работает следующее (инициализация члена):

 template <typename T> 
class btree {

  public:
    btree()
    {
       memberNode = new btree<T>::node;
    }
    ~btree() {}

    void init()
    {
       memberNode->lvl = new node[10];
    }

    struct node {   // <- this is just a declaration of a private inner-class
      list <T> elements;
      node* lvl;
    };

  private:
    size_t maxNodeElems;
    node*  memberNode;   // <- this is the actual private member

};

int _tmain(int argc, _TCHAR* argv[])
{
   btree<char> b;
   b.init();
}
  

Комментарии:

1. значит ли это, что я могу сделать n->lvl = new node[maxNodeElems 1]; , если я перейду node lvl[] на node *lvl ?

2. ДА. Вы можете сделать это непосредственно внутри класса (я назвал свою переменную memberNode). Члены структуры являются общедоступными по умолчанию, так что это должно сработать.

3. он выдает кучу ошибок, когда я пытаюсь memberNode = new btree<T>::node; в основном btree.tem:8: error: cannot convert 'int*' to 'btree<char>::node*' in assignment

4. как вы получили этот код для компиляции? Когда я его запускаю, он выдает кучу ошибок

5. Обратите внимание, что этот код содержит утечки памяти — для его использования требуется деструктор, конструктор копирования и оператор присваивания копирования. Было бы проще использовать std::vector для lvl , а не для самостоятельного управления динамическим массивом.