-7

我试图在类播放器中创建一个名为 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");
                                ^

编译器不应该能够将其转换为字符串吗?

编辑:这是我不应该更改的完整 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;
}

你们的快速回答真棒:-)

4

3 回答 3

4

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

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

于 2018-01-19T13:02:07.747 回答
2

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

你的构造函数有两个参数,你不能简单地省略第二个。如果您想创建Player具有默认分数的对象,请将您的构造函数声明为:

Player(string name, int points = 0);
于 2018-01-19T13:01:34.813 回答
2

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

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);
于 2018-01-19T13:06:59.397 回答