创建私有结构类型会给我一个错误“默认构造函数...无法引用-这是一个已删除的函数”。

时间:2018-12-16 23:38:40

标签: c++ data-structures linked-list

只允许创建自己添加的数据作为私有类型。请考虑以下代码。我的错误发生在“ newNode = new Node;”:

#ifndef COACHINGSTAFF_H
#define COACHINGSTAFF_H

#include <string>

typedef std::string IType;

class CoachingStaff
{
public:
    CoachingStaff(); // Create an empty CoachingStaff list

private:
    struct Node
    {
        std::string firstName;
        std::string lastName;
        IType& value;

        Node *next;
        Node *prev;
    };

    Node *head;
    Node *tail;

    Node* ptrToNested()
    {
        Node *newNode;
        newNode = new Node;
        return newNode;
    }
};

#endif // !

在“ newNode = new Node”行中,出现错误:

“无法引用默认的” CoachingStaff:Node“构造函数-它是一个已删除的函数。”

如果我尝试在代码中的任何地方为新的Node对象分配内存,我似乎会收到此错误。有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

让我们看看您的Node类。

struct Node
{
    std::string firstName;
    std::string lastName;
    IType& value;

    Node *next;
    Node *prev;
};

节点类正在存储对IType的引用。将引用存储在结构和类中很好,但是在构造结构时必须分配引用 。让我们看一下Node的构造函数:

struct Node
{
    std::string firstName;
    std::string lastName;
    IType& value;

    Node *next;
    Node *prev;
    Node(std::string const& fName, std::string const& lName, IType& val)
      : firstName(fName) //Constructs firstName
      , lastName(lName)  //Constructs lastName
      , value(val)       //Assigns the reference
    { } //The body of the constructor doesn't have to do anything
};

在这种情况下,value引用输入valNode没有默认构造函数,因为这将使值未分配,并且始终必须将引用分配给某些内容。这就是为什么编译器说它已被删除。

在某些情况下,您想让一个类存储一个引用。我在代码中多次使用了该代码,通常是在定义需要用作闭包的类时使用。这对于编写回调非常有用。但是,在您的特定情况下,直接存储IType可能是最佳选择:

struct Node
{
    std::string firstName;
    std::string lastName;
    //value is stored directly, 
    //so Node is default-constructible
    IType value; 

    Node *next;
    Node *prev;
};