2015-09-05 91 views
-1

我试着写一个简单的游戏,我无意中得到了错误错误:没有呼叫怪物::怪物()匹配功能

"No matching function for call to Monster::Monster()"

"No matching function for call to Player::Player()".

两人都是为游戏类构造函数。类游戏与任何形式的怪物或玩家无关。这里是代码。

的main.cpp

#include <game.h> 

#include <iostream> 

using namespace std; 

int main() { 
    Game game = Game(); 
    while(!game.hasFinished()) { 
     game.round(); 
    } 
} 

game.h

#ifndef GAME 
#define GAME 
#include <entity.h> 

class Game { 
    private: 
     bool finished = false; 

     char area[15][15]; 
     char defaultSign = '*'; 
     int size = 15; 

     Monster monsters[4]; 
     Player player; 

     int score = 0; 

     void cls(); 
     void fill(); 
     void display(); 

     void playerMove(); 
    public: 
     Game(); 
     void round(); 

     int getScore(); 
     bool hasFinished(); 
}; 

#endif 

game.cpp

#include <game.h> 

#include <iostream> 
#include <conio.h> 

Game::Game() { 
    player = Player(7, 7); 
    monsters[0] = Monster(0, 0); 
    monsters[1] = Monster(size - 1, size - 1); 
    monsters[2] = Monster(size - 1, 0); 
    monsters[3] = Monster(0, size - 1); 
} 
bool Game::hasFinished() { 
    return !finished; 
} 
int Game::getScore() { 
    return score; 
} 
void Game::cls() { 
    for(int i = 0; i < 50; i++) { 
     std::cout << "\n"; 
    } 
} 
void Game::fill() { 
    for(int i = 0; i < size; i++) { 
     for(int j = 0; j < size; j++) { 
      area[i][j] = defaultSign; 
     } 
    } 
    for(int i = 0; i < 4; i++) { 
     area[monsters[i].getX()][monsters[i].getY()] = monsters[i].getSign(); 
    } 
    area[player.getX()][player.getY()] = player.getSign(); 
} 
void Game::display() { 
    for(int i = 0; i < size; i++) { 
     for(int j = 0; j < size; j++) { 
      std::cout << area[i][j]; 
     } 
     std::cout << "\n"; 
    } 
} 
void Game::round() { 
    cls(); 
    fill(); 
    display(); 
    playerMove(); 
    for(int i = 0; i < 4; i++) { 
     monsters[i].moveTowards(player); 
    } 
    score++; 
} 
void Game::playerMove() { 
    bool moved = false; 
    while(!moved) { 
     char c = getch(); 
     if(c == 'w' || c == 'W') { 
      player.move(player.getX(), player.getY() + 1); 
      moved = true; 
     } 
     if(c == 'a' || c == 'A') { 
      player.move(player.getX() - 1, player.getY()); 
      moved = true; 
     } 
     if(c == 's' || c == 'S') { 
      player.move(player.getX(), player.getY() - 1); 
      moved = true; 
     } 
     if(c == 'd' || c == 'D') { 
      player.move(player.getX() + 1, player.getY()); 
      moved = true; 
     } 
    } 
} 

entity.h

#ifndef ENTITY 
#define ENTITY 

class Entity { 
    protected: 
     int x, y; 
     char sign; 
    public: 
     Entity(int xPos, int yPos); 
     int getX(); 
     int getY(); 
     void move(int xPos, int yPos); 
     char getSign(); 
}; 

class Player : public Entity { 
    private: 
     char sign = 'P'; 
    public: 
     Player(int xPos, int yPos); 
}; 

class Monster : public Entity { 
    private: 
     char sign = 'M'; 
    public: 
     Monster(int xPos, int yPos); 
     void moveTowards(Entity p); 
}; 

#endif 

entity.cpp

#include <entity.h> 

Entity::Entity(int xPos, int yPos) { 
    x = xPos; 
    y = yPos; 
    sign = '*'; 
} 
void Entity::move(int xPos, int yPos) { 
    x = xPos; 
    y = yPos; 
} 
int Entity::getX() { 
    return x; 
} 
int Entity::getY() { 
    return y; 
} 
char Entity::getSign() { 
    return sign; 
} 

Player::Player(int xPos, int yPos) 
     : Entity(xPos, yPos) { 
} 

Monster::Monster(int xPos, int yPos) 
     : Entity(xPos, yPos) { 
} 
void Monster::moveTowards(Entity p) { 
    int moveArea[2] = {x, y}; 
    if(x > p.getX()) moveArea[0]--; 
    if(x < p.getX()) moveArea[0]++; 
    if(y > p.getY()) moveArea[1]--; 
    if(y < p.getY()) moveArea[1]++; 
    move(moveArea[0], moveArea[1]); 
} 

请帮忙!

+1

您需要为'Monster'提供一个默认构造函数来实例化它们的原始数组。否则,请在'Game's成员初始值设定项列表中使用大括号初始化语法。 –

+0

太多的代码。 – GingerPlusPlus

回答

1

问题是

Monster monsters[4]; // ---> Means initiliaze 4 Monsters with a ctor which takes no arguments(eg default Ctor) 
Player player; ---> //The initiliaze 1 Player with a ctor which take no arguments 

自从你定义怪兽(INT XPOS,INT yPos);默认Ctors被删除。你必须自己定义它们。实体有同样的问题。我编译你的代码,如果你喜欢,你可以使用它。

添加“Entity()= default;” ,initiliaze x和y像下面,

class Entity { 
    protected: 
     int x = 0; --> Critical 
     int y = 0; --> Critical 
     char sign; 
    public: 
     Entity() = default; --> Critical 
     Entity(int xPos, int yPos); 
     int getX(); 
     int getY(); 
     void move(int xPos, int yPos); 
     char getSign(); 
}; 

做同样的播放机和怪物

class Monster : public Entity { 
    private: 
     char sign = 'M'; 
    public: 
     Monster(int xPos, int yPos); 
     Monster() = default; --> Critical 
     void moveTowards(Entity p); 
}; 


class Player : public Entity { 
    private: 
     char sign = 'P'; 
    public: 
     Player() = default; --> Critical 
     Player(int xPos, int yPos); 
}; 
+0

谢谢!这对我有帮助。 – apilat

0

您应该添加一个默认的构造,以你的怪物类,因为当怪物数组初始化它的隐式调用。如果由于某种原因你不想这样做,你可以改变怪物数组包含原始或智能指针到怪物对象。