#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
, а не для самостоятельного управления динамическим массивом.