C++ 如何为新结构分配内存?

C++ 如何为新结构分配内存?,c++,pointers,struct,linked-list,structure,C++,Pointers,Struct,Linked List,Structure,我试图在一个类的构造函数中为一个新的链表分配内存,但是当我试图编译它时,我得到一些奇怪的消息 struct Node { Song s; Node *next = NULL; }; tsuPod::tsuPod(int songs, int size) { MAX_SONGS = songs; MAX_MEM = size; memory = 0; Node *list = new Node; // call to implicitly deleted defau

我试图在一个类的构造函数中为一个新的链表分配内存,但是当我试图编译它时,我得到一些奇怪的消息

struct Node {
  Song s;
  Node *next = NULL;
};


tsuPod::tsuPod(int songs, int size)
{
  MAX_SONGS = songs;
  MAX_MEM   = size;
  memory = 0;
  Node *list = new Node; // call to implicitly deleted default constructor of Node
}

似乎这应该是一个相对快速的响应,因为我猜我缺少了
c++
的一些关键内容,不一定会出现语法错误。老实说,我甚至不知道structs可以有构造函数,但显然它们可以。不管怎样,如果有人能很快告诉我出了什么问题或者为什么它会说你会很棒!谢谢大家!

由于您没有为
节点
提供任何构造函数,
节点
的默认构造函数将由编译器提供。但当它尝试这样做时,遇到了一个问题:要(默认)构造
节点
,首先需要构造一首
歌曲
。由于以下三个原因之一,无法创建一首
歌曲

  • Song
    的所有构造函数都接受一个或多个参数,您没有为它们提供默认值
  • 您显式地删除了默认构造函数:
    Song()=delete
  • 有一个默认构造函数,它是私有的

  • 这就是为什么错误消息还指出默认构造函数是隐式删除的;您现在可以排除选项2和3。

    检查
    歌曲
    。如果没有默认构造函数,则
    节点也没有默认构造函数。疯狂必须在某个地方结束。默认构造函数意味着不接受任何参数?只是要确保这就是默认构造函数。我们前几天才知道他们是什么意思。如果您为
    歌曲
    提供了一个非默认构造函数(您很可能提供了),那么它的默认值将隐式消失,除非您也提供了一个构造函数。您应该为
    节点
    提供一个指针,以便正确初始化
    下一个
    指针(您现在使用的语法似乎错误,但我太累了,所以可能是睡眠问题)。您的代码没有问题(请参阅运行等效代码)-可能您的编译器太旧,无法正确支持
    =NULL
    符号,或者您在
    节点中有一些其他成员函数,您没有向我们展示…?@TonyD您发布的等效代码可能不等效。如果OP的类
    Song
    没有默认构造函数,那么等价的代码将报告与OP看到的错误几乎相同的错误。我同意OP没有向我们展示一些东西,但我认为这是
    Song::Song
    ,这将是错误背后的全部原因。