只允许创建自己添加的数据作为私有类型。请考虑以下代码。我的错误发生在“ 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对象分配内存,我似乎会收到此错误。有人可以帮我解决这个问题吗?
答案 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
引用输入val
。 Node
没有默认构造函数,因为这将使值未分配,并且始终必须将引用分配给某些内容。这就是为什么编译器说它已被删除。
在某些情况下,您想让一个类存储一个引用。我在代码中多次使用了该代码,通常是在定义需要用作闭包的类时使用。这对于编写回调非常有用。但是,在您的特定情况下,直接存储IType
可能是最佳选择:
struct Node
{
std::string firstName;
std::string lastName;
//value is stored directly,
//so Node is default-constructible
IType value;
Node *next;
Node *prev;
};