C++:没有匹配的函数来调用const char

C++:没有匹配的函数来调用const char,c++,method-parameters,C++,Method Parameters,我正在尝试在类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 pt

我正在尝试在类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
编译器难道不能将其转换为字符串吗

编辑:这是我不应该更改的完整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;
}
你们的快速回答真是太棒了:-

从const char[6]到std::string的转换将起作用,而不是这里的问题

构造函数有两个参数,不能简单地忽略第二个参数。如果要创建具有默认分数的玩家对象,请将构造函数声明为:

Player(string name, int points = 0);

您将player的构造函数声明为Playerstring名称,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){
}

不要在dhe定义中写入默认值,因为这很可能会产生编译器错误。

首先,声明构造函数有两个参数:

Player(string name, int points);
但将其定义为只有一个:

Player::Player(string name):
    _name(name), _points(0){
}
这将导致编译错误。从类主体中的声明中删除第二个参数并保持main.cpp不变,或者将第二个参数添加到player.cpp中的定义中:

#include <string>

using namespace std;

Player::Player(string name):
    _name(name), _points(0){
}
然后明确指定“点”的值:

Player("Matti", 0);
您也可以同时使用这两个选项-只需为点添加默认值:

然后,这两条线都可以工作:

Player player1 ("Matti");
Player player2 ("Matti", 0);

编译器难道不能将其转换为字符串吗?是的,它可以很好地将其转换为std::string。但这不是问题所在:没有声明只接受std::string的构造函数,还有一个额外的int参数,您忘记传递给构造函数了。您的声明有Playerstring,int,但定义是playerstringt这是一个赋值,我不应该更改main.cpp。两名球员都有特定的分数。有没有一种方法可以在不首先声明的情况下将int点分配给两个玩家?请参见我的答案,为score参数使用默认值。如果不应该更改main.cpp,也不应该更改构造函数的原型或删除_points成员,而且两个玩家都从零开始。这仍然会导致链接器错误;函数定义也需要修改changed@xEric_xD-我用GNU编译器试过了,我不需要修改定义。如果我尝试添加一个默认值,我甚至会得到一个错误。这与默认值无关。声明的构造函数Playerstring名称,int points;在OP提供的代码中没有定义。他只定义Player::Playerstring名称,而Playerstring名称没有声明
Player("Matti", 0);
class Player
{
...
   Player(string name, int points = 0);
};
Player player1 ("Matti");
Player player2 ("Matti", 0);