为什么没有可用于struct的默认构造函数?

时间:2016-02-28 12:39:34

标签: c++ new-operator

我有一个结构:

struct ListNode {
     int val;
     ListNode *next;
     ListNode(int x) : val(x), next(NULL) {}
};

我正在尝试初始化它:

ListNode* res = new ListNode();
ListNode* start = res;

但我得到了:

error C2512: 'ListNode' : no appropriate default constructor available

为什么?

3 个答案:

答案 0 :(得分:6)

  

但我得到了:

error C2512: 'ListNode' : no appropriate default constructor available
     

为什么?

确定您收到了该错误,因为您没有为ListNode声明的默认构造函数。关于这一点,错误信息非常清楚。

一旦声明了自定义构造函数ListNode(int x);,编译器就不再为您生成默认构造函数。

要解决此问题,请声明默认构造函数 1

 ListNode() : val(), next(NULL) {}

或调用声明的

 ListNode* res = new ListNode(42);

1) struct与此class的行为完全不同(如果这应该导致您的混淆)。

答案 1 :(得分:1)

在本声明中

ListNode* res = new ListNode();

称为默认构造函数。

但是根据结构定义

struct ListNode {
     int val;
     ListNode *next;
     ListNode(int x) : val(x), next(NULL) {}
};

该结构具有参数化构造函数。

实际上,没有必要为此结构声明构造函数。

最好将其声明为聚合

struct ListNode {
     int val;
     ListNode *next;
};

最初列表应该是nullptr指针。例如

ListNode *start = nullptr;

如果您希望最初列表包含节点,那么您可以编写例如

ListNode *start = new ListNode { 10, nullptr };

答案 2 :(得分:-1)

编译器不会为您生成默认值,因为您已经定义了构造函数。只需向其添加默认构造函数或向参数添加默认值(严格意义上与默认构造函数不同),如下所示

struct ListNode {
     int val;
     ListNode *next;
     ListNode(int x = 0) : val(x), next(NULL) {}
};

另外,请改用nullptr