我正在尝试为二进制搜索树创建一个节点,该节点能够存储类的对象。这就是我目前所拥有的:
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
的东西的方式(