将数组中的对象设置为新对象

时间:2014-07-18 13:12:21

标签: c++ arrays

我有一个具有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

2 个答案:

答案 0 :(得分:0)

您缺少类RoomRoom() {})的默认构造函数。将其添加到会议室类或指定如何在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();