Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 结构上没有合适的默认构造函数_C++_Constructor_Default Constructor - Fatal编程技术网

C++ 结构上没有合适的默认构造函数

C++ 结构上没有合适的默认构造函数,c++,constructor,default-constructor,C++,Constructor,Default Constructor,免责声明:我查看了其他可能熟悉这种情况的问题,但我没有找到解决方案 情况:我正在尝试创建Levelnode类型的链接列表(结构)。在创建新节点时,它应该创建一个新级别(级别类) 问题:我在第18行(是.cpp文件,不是头文件)收到一个错误,错误为- 我在头文件中有一个默认构造函数,所以我真的不明白为什么会发生这个错误 以下是Nodes.h头文件: #ifndef NODES_H #define NODES_H #include <iostream> #include <

免责声明:我查看了其他可能熟悉这种情况的问题,但我没有找到解决方案

情况:我正在尝试创建Levelnode类型的链接列表(结构)。在创建新节点时,它应该创建一个新级别(级别类)

问题:我在第18行(是.cpp文件,不是头文件)收到一个错误,错误为-

我在头文件中有一个默认构造函数,所以我真的不明白为什么会发生这个错误

以下是Nodes.h头文件:

    #ifndef NODES_H
#define NODES_H

#include <iostream>
#include <string>
#include "structs.h"
#include "Level.h"


using namespace std;

class Nodes 
{
    private:

        Levelnode * p;
        Level * level;

    public:
        Nodes()
        {

        }

        ~Nodes();
        Levelnode * CreateNode(Level * newLevel, SDL_Surface *screen1, string levelName, SDL_Rect camera1);
        void InsertAfter(Levelnode * p, Levelnode * newNode);
        Levelnode * InsertFirst(Levelnode * p, Levelnode * newNode);
        void DeleteNode(Levelnode * p);
        void PrintList(Levelnode * p);
};
#endif
#ifndef STRUCTS_H
#define STRUCTS_H
#include <Windows.h>
#include <string>
#include "Level.h"

using namespace std;

struct position
{
    int x;
    int y;
};


struct Levelnode
{
    Level L;
    Levelnode * next;
};

#endif
\ifndef节点
#定义节点
#包括
#包括
#包括“structs.h”
#包括“h级”
使用名称空间std;
类节点
{
私人:
Levelnode*p;
级别*级别;
公众:
节点()
{
}
~Nodes();
Levelnode*CreateNode(Level*newLevel,SDL_Surface*screen1,字符串levelName,SDL_Rect camera1);
void InsertAfter(Levelnode*p,Levelnode*newNode);
Levelnode*InsertFirst(Levelnode*p,Levelnode*newNode);
void DeleteNode(Levelnode*p);
作废打印列表(Levelnode*p);
};
#恩迪夫
以下是.cpp文件:

#include <Windows.h>
#include <iostream>
#include <string>
#include "Nodes.h"
#include "structs.h"
#include "Level.h"


    Nodes::~Nodes()
    {


    }

    Levelnode * Nodes::CreateNode(Level * newLevel, SDL_Surface *screen1, string levelName, SDL_Rect camera1)
    {
        Levelnode * newNode;
        newNode = new Levelnode;
        level = new Level(screen1, levelName, camera1);
        level->draw();
        newNode->L = *newLevel;
        newNode->next = NULL;
        return newNode;
    }

    void Nodes::InsertAfter(Levelnode * p, Levelnode * newNode)
    {
        newNode->next = p->next;
        p->next = newNode;
    }

    Levelnode * Nodes::InsertFirst(Levelnode * p, Levelnode * newNode)
    {
        newNode->next = p;
        return newNode;
    }

    void Nodes::DeleteNode(Levelnode * p)
    {
        Levelnode * pTemp;
        while ( p != NULL)
        {
            pTemp = p;
            p = p->next;
            delete pTemp;

        }
    }

    void Nodes::PrintList(Levelnode * p)
    {
        while (p != NULL)
        {
            p->L.draw();
            p = p->next;
        }

    }
#包括
#包括
#包括
#包括“Nodes.h”
#包括“structs.h”
#包括“h级”
节点::~Nodes()
{
}
Levelnode*Nodes::CreateNode(Level*newLevel,SDL_Surface*screen1,字符串levelName,SDL_Rect camera1)
{
Levelnode*newNode;
newNode=新的Levelnode;
级别=新级别(屏幕1,级别名称,摄像头1);
level->draw();
newNode->L=*newLevel;
newNode->next=NULL;
返回newNode;
}
void Nodes::InsertAfter(Levelnode*p,Levelnode*newNode)
{
newNode->next=p->next;
p->next=newNode;
}
Levelnode*Nodes::InsertFirst(Levelnode*p,Levelnode*newNode)
{
newNode->next=p;
返回newNode;
}
void节点::DeleteNode(Levelnode*p)
{
Levelnode*pTemp;
while(p!=NULL)
{
pTemp=p;
p=p->next;
删除pTemp;
}
}
void节点::打印列表(Levelnode*p)
{
while(p!=NULL)
{
p->L.draw();
p=p->next;
}
}
结构头文件:

    #ifndef NODES_H
#define NODES_H

#include <iostream>
#include <string>
#include "structs.h"
#include "Level.h"


using namespace std;

class Nodes 
{
    private:

        Levelnode * p;
        Level * level;

    public:
        Nodes()
        {

        }

        ~Nodes();
        Levelnode * CreateNode(Level * newLevel, SDL_Surface *screen1, string levelName, SDL_Rect camera1);
        void InsertAfter(Levelnode * p, Levelnode * newNode);
        Levelnode * InsertFirst(Levelnode * p, Levelnode * newNode);
        void DeleteNode(Levelnode * p);
        void PrintList(Levelnode * p);
};
#endif
#ifndef STRUCTS_H
#define STRUCTS_H
#include <Windows.h>
#include <string>
#include "Level.h"

using namespace std;

struct position
{
    int x;
    int y;
};


struct Levelnode
{
    Level L;
    Levelnode * next;
};

#endif
\ifndef结构
#定义结构
#包括
#包括
#包括“h级”
使用名称空间std;
结构位置
{
int x;
int-y;
};
结构级别节点
{
L级;
Levelnode*next;
};
#恩迪夫

最可能的原因是,由于您的
Levelnode
结构:

struct Levelnode
{
    Level L;
    Levelnode * next;
};
具有
Level
成员,并且
Level
缺少默认的ctor,编译器为
Levelnode
生成的默认ctor无法初始化Levelnode::L成员。结果是编译器实际上根本不会生成默认的
Levelnode
ctor。如果尝试创建
Levelnode

Levelnode node;
您将得到一个关于
Levelnode
没有默认ctor的错误

您需要为
Levelnode
提供自己的默认ctor,该ctor应该使用适当的
L
ctor初始化Levelnode::L。比如:

struct Levelnode
{
    Level L;
    Levelnode * next;

    Levelnode()
        : L(ctor arguments)
    { }
};

另一个解决方案是为
Level
提供一个默认的ctor,如果这对该类有意义的话。

这意味着
Levelnode
没有无参数构造函数。请包含Level.h的源代码,我猜它具有struct Levelnode的声明(否则,包括该头)struct的声明位于另一个名为structs.h的头文件中,我已将其包含在Nodes.h和Nodes.cpp中。对不起,我的意思是请向我们显示(现在)structs.h的源代码,而不是“#include”。很抱歉造成混淆。已添加structs.h的source:)wierd是,Levelnode是一个struct,而不是一个constructor@TimOgunmakin结构与类相同。唯一的区别是,它们的成员在默认情况下是公共的,而在类中它们是私有的。没有其他区别。如果您发布Levelnode结构,我们可能会更清楚地看到发生了什么。好的,谢谢,我现在在另一个下面包含了Levelnode结构classes@TimOgunmakin我改变了答案,很可能是因为这个问题。