C++:没有匹配的函数来调用 const char
C++: No matching function to call to const char
我正在尝试在 class 播放器中创建一个名为播放器的对象。
#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;
}
你们的快速回答真棒:-)
从 const char[6]
到 std::string
的转换将起作用,这不是这里的问题。
你的构造函数有两个参数,你不能简单地省略第二个。如果您想创建具有默认分数的 Player
个对象,请将您的构造函数声明为:
Player(string name, int points = 0);
您将播放器的构造函数声明为 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){
}
那应该会给你编译错误。从 class 正文中的声明中删除第二个参数并保持 main.cpp 不变,或者将第二个参数添加到 player.cpp
:
中的定义中
Player::Player(string name, int points):
_name(name), _points(points){
}
然后明确指定 'points' 的值:
Player("Matti", 0);
您也可以同时拥有两者 - 只需为 points
添加默认值:
class Player
{
...
Player(string name, int points = 0);
};
那么,这两行都可以工作:
Player player1 ("Matti");
Player player2 ("Matti", 0);
我正在尝试在 class 播放器中创建一个名为播放器的对象。
#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;
}
你们的快速回答真棒:-)
从 const char[6]
到 std::string
的转换将起作用,这不是这里的问题。
你的构造函数有两个参数,你不能简单地省略第二个。如果您想创建具有默认分数的 Player
个对象,请将您的构造函数声明为:
Player(string name, int points = 0);
您将播放器的构造函数声明为 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){
}
那应该会给你编译错误。从 class 正文中的声明中删除第二个参数并保持 main.cpp 不变,或者将第二个参数添加到 player.cpp
:
Player::Player(string name, int points):
_name(name), _points(points){
}
然后明确指定 'points' 的值:
Player("Matti", 0);
您也可以同时拥有两者 - 只需为 points
添加默认值:
class Player
{
...
Player(string name, int points = 0);
};
那么,这两行都可以工作:
Player player1 ("Matti");
Player player2 ("Matti", 0);