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

No appropriate default constructor available on struct

本文关键字:默认 构造函数 结构上      更新时间:2023-10-16

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

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

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

Error   2   error C2512: 'Levelnode' : no appropriate default constructor available c:userstimidesktopludum dareld27nodes.cpp 18  1   LD27

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

下面是 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

这是.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;
        }
    }

结构头文件:

#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

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

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

具有 Level 成员,并且缺少默认 ctor,Level编译器生成的 Levelnode 的默认 ctor 无法初始化 Levelnode::L 成员。结果是编译器实际上根本没有生成默认的Levelnode ctor。如果您尝试创建Levelnode

Levelnode node;

您将收到有关Levelnode没有默认 CTOR 的错误。

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

struct Levelnode
{
    Level L;
    Levelnode * next;
    Levelnode()
        : L(ctor arguments)
    { }
};

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