C++: нет подходящей функции для вызова const char

Я пытаюсь создать объект с именем 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;
}

Вы, ребята, круты с вашими быстрыми ответами:-)

3 ответа

Решение

Вы объявили конструктор игрока как 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){
}

Важно не записывать значение по умолчанию внутри определения, потому что это, скорее всего, приведет к ошибке компилятора.

Прежде всего, вы объявляете ваш конструктор, имеющий два параметра:

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);

Преобразование из const char[6] в std::string будет работать и не проблема здесь.

Ваш конструктор имеет два параметра, вы не можете просто опустить второй. Если вам нравится создавать Player объекты со счетом по умолчанию, объявите ваш конструктор как:

Player(string name, int points = 0);
Другие вопросы по тегам