Как сохранить объект класса в двоичном узле дерева поиска? - PullRequest
4 голосов
/ 29 апреля 2020

Я пытаюсь создать узел в бинарном дереве поиска, способный хранить объекты класса. Это то, что у меня есть:

struct person
{
string name;
int age;
person(string, int);
};

struct node 
{
person p;
node* left;
node* right;
};

Когда я пытаюсь объявить узел в основном, например:

int main(){

node* root1 = new node();
root1->p("bob", 25);

return 0;
}

Я получаю следующие сообщения об ошибках: Неявный вызов -установленный по умолчанию конструктор 'node' & Type 'person' не предоставляет оператора вызова

Может кто-то указать, что я делаю неправильно? Я думал, что при построении объекта в основном с параметрами автоматически вызовет конструктор класса человек?

Ответы [ 2 ]

5 голосов
/ 29 апреля 2020

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

root1->p = person{"bob", 25};

Кроме того, эта строка:

node* root1 = new node();

не будет компилироваться, поскольку для person.

* 1011 нет конструктора по умолчанию. * Вы можете назвать это так:
node* root1 = new node{{"bob", 25}};

или восстановить конструктор по умолчанию для person с помощью:

person() = default;
1 голос
/ 29 апреля 2020

Cigien ответ правильный и причина, почему вы получаете эту ошибку. Это просто то, что вы можете сделать, чтобы сделать ваше дерево бинарного поиска более общим.

Если вы действительно хотите go представить, чем вы могли бы заглянуть в шаблоны классов . Они позволяют вам определить общую идею программы независимо от типа, который будет иметь конечный член.

Это будет выглядеть примерно так:

template<class t>
struct node 
{
  t data;
  node* left;
  node* right;
}

И определение указателя будет выглядеть следующим образом:

int main(){

  node<person>* root1 = new node<person>();

  return 0;
}

(это также, как навесное оборудование, например std::vector)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...