我有一个具有2D对象数组的类,但是在调用函数将对象设置为新对象时会抛出错误。
这是我的游戏课程。它很简单而且不是很大。
#include <iostream>
#include <stdio.h>
#include "room.hpp"
class Game
{
private:
Room map[50][50];
public:
Game(std::string title);
~Game()=default;
void add_room(int x, int y);
void trace(std::string text);
};
这是我的game.cpp。 add_room()函数中发生错误。 我有适当的进口和一切。不知道出了什么问题。
#include <iostream>
#include <stdio.h>
#include "game.hpp"
#include "room.hpp"
Game::Game(std::string name)
{
trace(name);
}
void Game::add_room(int x, int y, Room r)
{
map[x][y]=r;
}
void Game::trace(std::string text)
{
printf("%s\n", text.c_str());
}
这是我的Room class
#ifndef Room_H
#define Room_H
class Room
{
private:
std::string name;
std::string desc;
public:
Room(std::string n, std::string d);
~Room()=default;
};
#endif
这里是cpp
#include <iostream>
#include <stdio.h>
#include "room.hpp"
Room::Room(std::string n, std::string d)
{
name=n;
desc=d;
}
无论如何,这里出现了错误:
../TAGE/game.cpp: In constructor 'Game::Game(std::string)':
../TAGE/game.cpp:6:28: error: no matching function for call to 'Room::Room()'
Game::Game(std::string name)
^
../TAGE/game.cpp:6:28: note: candidates are:
In file included from ../TAGE/game.hpp:6:0,
from ../TAGE/game.cpp:3:
../TAGE/room.hpp:11:3: note: Room::Room(std::string, std::string)
Room(std::string n, std::string d);
^
../TAGE/room.hpp:11:3: note: candidate expects 2 arguments, 0 provided
../TAGE/room.hpp:5:7: note: Room::Room(const Room&)
class Room
^
../TAGE/room.hpp:5:7: note: candidate expects 1 argument, 0 provided
../TAGE/game.cpp: In constructor 'Game::Game(std::string)':
../TAGE/game.cpp:6:28: error: no matching function for call to 'Room::Room()'
Game::Game(std::string name)
^
../TAGE/game.cpp:6:28: note: candidates are:
In file included from ../TAGE/game.hpp:6:0,
from ../TAGE/game.cpp:3:
../TAGE/room.hpp:11:3: note: Room::Room(std::string, std::string)
Room(std::string n, std::string d);
^
../TAGE/room.hpp:11:3: note: candidate expects 2 arguments, 0 provided
../TAGE/room.hpp:5:7: note: Room::Room(const Room&)
class Room
^
../TAGE/room.hpp:5:7: note: candidate expects 1 argument, 0 provided
答案 0 :(得分:0)
您缺少类Room
(Room() {}
)的默认构造函数。将其添加到会议室类或指定如何在Game
课程中初始化会议室类。游戏类中的函数定义也缺少Room参数。
另外,除非你想复制你传递给函数/构造函数的字符串,否则你可能希望通过const引用传递(以下假设你有一个支持C ++ 11的编译器,如果它没有改变cstdio到stdio.h):
#include <iostream>
#include <cstdio>
#include "room.hpp"
class Game
{
public:
Game(const std::string& title);
void add_room(int x, int y, const Room& r);
void trace(const std::string& text);
private:
Room map[50][50];
};
.cpp
文件看起来像:
#include "game.hpp"
Game::Game(const std::string& name)
{
trace(name);
}
void Game::add_room(int x, int y, const Room& r)
{
map[x][y] = r;
}
void Game::trace(const std::string& text)
{
//Consider std::cout << text << std::endl;
printf("%s\n", text.c_str());
}
关于修改
您没有定义构造函数。你定义了一个析构函数。像这样定义:
Room() {}
或看到你可以使用default
:
Room() = default;
而不是:
~Room() = default;
<强>解释强>
您确实定义了一个构造函数,但该构造函数需要两个字符串。现在,当您使用Room
在游戏类中声明数组时,它将在您的Game构造函数被调用时初始化这些对象。
此时它注意到没有关于对象应该被初始化的方式的规范(没有字符串或任何传递的东西)。所以它将开始寻找一个不带任何参数的构造函数。这是错误的来源,它告诉你房间类没有没有参数的构造函数。
所以你添加没有参数的空构造函数,以便它可以根据它构造对象。
答案 1 :(得分:0)
你在做:
map[x][y]=r;
你应该这样做:
CRoom* map[50][50];
for(int i = 0; i < 50; ++i)
for(int j = 0; j < 50; ++j)
map[i][j] = nullptr;
map[0][0] = new CRoom("Hola", "Hello");
map[0][0]->PrintOut();