【问题标题】:c++ no matching constructor when constructor is declaredc++ 声明构造函数时没有匹配的构造函数
【发布时间】:2022-01-15 23:31:17
【问题描述】:

我正在尝试用 C++ 创建一个非常基本的文本游戏。我的问题在于代表当前游戏状态的 State 类。

声明类的.h文件:

#ifndef TEXTADV_STATE_H
#define TEXTADV_STATE_H

#include "Room.h"
#include "GameObject.h"

class State {
    Room *currentRoom;
    Room *previousRoom;
public:
    explicit State(Room *startRoom);
    static std::list<GameObject*> inventory;
    void goTo(Room *target);
    void goBack();
    void announceLoc() const;
    static void addObj(GameObject *obj);
    static void remObj(Gameobject *obj);
    Room* getCurrentRoom() const;
    Room* getPrevRoom() const;
};

#endif //TEXTADV_STATE_H

对应.cpp文件中构造函数的定义:

State::State(Room *startRoom) : currentRoom(startRoom) {};

在 main.cpp 中,我将 State 对象初始化为:

State *currentState;

为 currentState 赋值时出现此错误: 没有用于初始化“状态”候选构造函数(隐式默认构造函数)的匹配构造函数不可行:需要 0 个参数,但提供了 1 个

void initState() {
    currentState = new State(Room::rooms.front());
}

我读过的其他问题/线程似乎说该错误与构造函数重载或没有默认构造函数有关。这些声明过去可以正常工作,我没有更改它们,所以我不确定这里发生了什么。

这里是我的一些房间类(.h 文件):

#ifndef TEXTADV_ROOM_H
#define TEXTADV_ROOM_H

#include <string>
#include <forward_list>
#include <list>
#include "GameObject.h"

using std::string;

/**
 * Represents a room (accessible location in the game).
 */
class Room {
public:
    /**
     * Constructs a new Room.
     * @param _name Name of the room.
     * @param _desc Description of the room.
     */
    Room(const string *_name, const string *_desc);

    /**
     * List storing all rooms that have been registered via addRoom().
     */
    static std::list<Room*> rooms;

    /**
     * Creates a new Room with the given parameters and register it with the static list.
     * @param _name Name of the room.
     * @param _desc Description of the room.
     */
    static Room* addRoom(const string* _name, const string* _desc);
};

#endif //TEXTADV_ROOM_H

谢谢。

【问题讨论】:

  • “试图初始化一个 State 对象”——不,显示的代码没有初始化任何东西。它为一个名为currentState 的现有对象分配了一些东西。你能展示这个对象是如何构造的,并证明它正确地调用了构造函数吗?
  • @samVarshavchik 对不起,我混淆了我的术语。我已经用 currentState 对象的初始化更新了这个问题。谢谢。
  • 你有我们可以检查的回购吗?谢谢!
  • @LarryDaVinci 我快速创建了一个您可以查看的:github.com/Sterlehelanthropus/c-text-game/tree/main 这包含所有重要文件。有一些对字符串(例如 &r4name)和自动换行函数的引用。我没有包含这些文件,因为一个只是一个存储字符串的文件,另一个是一组用于将文本输出到控制台的函数,这与我遇到的问题无关。谢谢。

标签: c++ class constructor


【解决方案1】:

std::list::front() 返回一个迭代器。不是该元素的(副本)。
您还必须首先检查列表是否为空。

void initState() {
  if (not Rooms::rooms.empty()) 
    currentState = new State(Room::rooms.front());
}

此外,为您的类声明构造函数会删除默认构造函数。
你可以用= default添加回来

// foo.hpp
class foo {
  int *p_, *k_;
public:
  explicit foo(int*, int*);
  foo() = default;
};

// foo.cpp
foo::foo(int *p, int *k) 
  : p_{ p }, k_{ k }
{}

【讨论】:

  • 谢谢。就我的程序而言,该列表永远不会为空,但感谢您的警告。 std::list::front() 在这里返回对列表第一个元素处数据的读/写引用,并且(我认为)返回一个指针,如在 room.h 中的列表构造中声明的那样。此外,使用 = default 添加默认构造函数不会改变任何内容。这段代码之前都可以正常工作,所以我不确定这些问题中的任何一个是问题所在,但我很感激你的建议。我确实看到了这个实现的问题(不是 100% 我自己的)。谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-22
  • 1970-01-01
  • 2012-10-10
相关资源
最近更新 更多