【问题标题】:No appropriate default constructor available on structstruct 上没有可用的适当默认构造函数
【发布时间】:2013-09-24 09:26:05
【问题描述】:

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

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

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

Error   2   error C2512: 'Levelnode' : no appropriate default constructor available c:\users\timi\desktop\ludum dare\ld27\nodes.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没有无参数构造函数。
  • 请包含 Level.h 的源代码,我猜它有 struct Levelnode 的声明(否则,包含该标头)
  • 结构的声明位于另一个名为 structs.h 的头文件中,我已将其包含在 Nodes.h 和 Nodes.cpp 中
  • 抱歉,我的意思是请告诉我们(现在)structs.h 的来源,而不是“#include”。很抱歉造成混乱。
  • structs.h 的源代码已添加 :)

标签: c++ constructor default-constructor


【解决方案1】:

最可能的原因是因为你的 Levelnode 结构:

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

有一个Level 成员,而Level 缺少一个默认的ctor,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,如果这对那个类有意义的话。

【讨论】:

  • 奇怪的是,Levelnode 是一个结构,而不是一个构造函数
  • @TimOgunmakin 结构与类相同。唯一的区别是它们的成员默认是公共的,而在类中它们是私有的。没有其他区别。如果您发布 Levelnode 结构,我们可能会更清楚地看到发生了什么。
  • 好的,谢谢,我现在已经在其他类下面包含了 Levelnode 结构
  • @TimOgunmakin 我更改了答案,可能是导致问题的原因。
猜你喜欢
  • 2018-09-11
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
  • 2012-11-24
相关资源
最近更新 更多