Я пытаюсь создать объект с именем player в классе player.
#include <string>
#ifndef PLAYER_HH
#define PLAYER_HH
using namespace std;
class Player
{
public:
Player(string name, int points);
const string get_name();
int get_points();
void add_points(int pts);
bool has_won();
private:
string _name;
};
#endif // PLAYER_HH
из player.cpp:
#include <string>
using namespace std;
Player::Player(string name):
_name(name), _points(0){
}
Теперь проблема в основной функции, я получаю эту ошибку:
error: no matching function for call to ‘Player::Player(const char [6])’
Player player1 = Player("Matti");
^
Разве компилятор не может преобразовать его в строку?
edit: вот полный main.cpp, который я не должен менять:
#include <cstdlib>
#include <iostream>
#include <string>
#include "player.hh"
int main()
{
Player player1 = Player("Matti");
Player player2 = Player("Teppo");
Player* in_turn = 0;
int turn = 1;
while (true)
{
if (turn % 2 != 0)
{
in_turn = &player1;
}
else
{
in_turn = &player2;
}
std::cout << "Enter the score of player " << in_turn->get_name()
<< " of turn " << turn << ": ";
int pts = 0;
std::cin >> pts;
in_turn->add_points(pts);
if (in_turn->has_won())
{
std::cout << "Game over! The winner is " << in_turn->get_name() << "!" << std::endl;
return EXIT_SUCCESS;
}
std::cout << std::endl;
std::cout << "Scoreboard after turn " << turn << ":" << std::endl;
std::cout << player1.get_name() << ": " << player1.get_points() << "p" << std::endl;
std::cout << player2.get_name() << ": " << player2.get_points() << "p" << std::endl;
std::cout << std::endl;
turn += 1;
}
return EXIT_SUCCESS;
}
Вы, ребята, круты с вашими быстрыми ответами 🙂
Вы объявили конструктор игрока как Player(string name, int points);
,
Если вы определяете функцию с двумя параметрами, вы должны использовать оба.
Создайте свой объект с
Player player1 = Player("Matti", 0);
Если вы все еще хотите вызывать его только с одним параметром, вы должны установить значение по умолчанию, подобное этому.
class Player
{
public:
...
Player(string name, int points = 0); // replace 0 with whatever you want to be default.
...
}
Тогда вы можете использовать оба варианта. Тот, что выше, и тот, который вы пытались
Player player1 = Player("Matti");
Конечно, заголовок функции вашего определения должен совпадать с заголовком в объявлении:
Player::Player(string name, int points):
_name(name), _points(points){
}
Важно не записывать значение по умолчанию внутри определения, потому что это, скорее всего, приведет к ошибке компилятора.
Преобразование из const char[6]
в std::string
будет работать и не проблема здесь.
Ваш конструктор имеет два параметры, вы не можете просто опустить второй. Если вам нравится создавать Player
объекты со счетом по умолчанию, объявите ваш конструктор как:
Player(string name, int points = 0);
Прежде всего, вы объявляете ваш конструктор, имеющий два параметра:
Player(string name, int points);
но определите это как наличие только одного:
Player::Player(string name):
_name(name), _points(0){
}
Это должно дать вам ошибку компиляции. Удалите второй параметр из объявления в теле класса и сохраните main.cpp как есть, либо добавьте второй параметр в определение в player.cpp
:
Player::Player(string name, int points):
_name(name), _points(points){
}
а затем явно укажите значение для «точек»:
Player("Matti", 0);
Вы также можете иметь оба — просто добавьте значение по умолчанию для points
:
class Player
{
...
Player(string name, int points = 0);
};
Тогда обе эти строки будут работать:
Player player1 ("Matti");
Player player2 ("Matti", 0);