如何将类对象存储到二进制搜索树节点中



我正在尝试为二进制搜索树创建一个节点,该节点能够存储类的对象。这就是我目前所拥有的:

struct person
{
string name;
int age;
person(string, int);
};
struct node 
{
person p;
node* left;
node* right;
};

当我试图在main中声明一个节点时,例如:

int main(){
node* root1 = new node();
root1->p("bob", 25);
return 0;
}

我收到以下错误消息:调用隐式删除的"node"的默认构造函数&类型"person"不提供呼叫操作员

有人能指出我做错了什么吗?我想通过在main中用参数构造对象会自动调用person类的构造函数吗?

当您创建root1时,p是构造的,并且您不能在现有对象上调用构造函数,因此编译器认为您正在进行函数调用。相反,你可以做:

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

此外,这一行:

node* root1 = new node();

不会编译,因为person没有默认的构造函数。

你可以这样称呼它:

node* root1 = new node{{"bob", 25}};

或者恢复person的默认构造函数,使用:

person() = default;

Cigien的答案是正确的,以及您出现错误的原因。这只是你可以做的事情,使你的二进制搜索树更通用。

如果你真的想变得花哨,你可以看看模板类。这些允许您独立于最终成员的类型来指定te程序的总体思想。

这看起来像:

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

指针定义看起来像:

int main(){
node<person>* root1 = new node<person>();
return 0;
}

(这也是实现类似std::vector的东西的方式(

最新更新