在 C++ 中没有匹配的初始化构造函数错误。我的构造函数有什么问题?
No matching Constructor Error For Initialization in c++. Whats wrong with my constructor?
我在头文件中有一个class如下:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
class ShowTicket {
public:
bool is_sold(void){
if (sold_status == true){
return true;
}
else{
return false;
}
}
void sell_seat(void){
sold_status = true;
}
string print_ticket(void){
ostringstream sout;
if(sold_status == true){
sout<<row<<" "<<seat_number<<"sold";
}
else{
sout<<row<<" "<<seat_number<<"available";
}
return sout.str();
}
bool sold_status;
const char* row;
const char* seat_number;
ShowTicket(const char* Row, const char* SeatNumber):
sold_status{false},
row(Row),
seat_number(SeatNumber)
{}
};
测试这个class的主要函数如下:
#include <iostream>
#include <string>
#include <sstream>
#include "showticket.h"
using namespace std;
int main () {
ShowTicket myticket1("AA","101");
ShowTicket myticket2("AA","102");
if(!myticket1.is_sold())
myticket1.sell_seat ();
cout << myticket1.print_ticket() << endl;
cout << myticket2.print_ticket() << endl;
return 0;
}
创建 myticket 1 和 2 时出现错误“No matching constructor for initialization of 'ShowTicket”,但我相信我的构造函数接受这些参数,所以我不确定如何解决。
如有任何建议,我们将不胜感激。
从表面上看,您只想提供两个参数,但您的构造函数需要三个:
ShowTicket(const char* row, const char* seat_number, bool sold_status){
sold_status = false;
}
构造函数的主体让人相信您想要初始化一个新创建的 ShowTicket
,并将 sold_status
设置为 false
。您可以直接在成员初始值设定项列表中执行此操作:
ShowTicket(const char* row, const char* seat_number) : // note the colon
sold_status{false} // <- here
{}
如果不是这样,你可以让sold_status
有一个默认值,下面设置为false
:
ShowTicket(const char* row, const char* seat_number, bool sold_status = false) :
sold_status{sold_status}
{}
我还建议对参数和成员变量使用不同的名称。否则它很容易变得凌乱:
ShowTicket(const char* row, const char* seat_number, bool SoldStatus = false) :
sold_status{SoldStatus}
{}
另请注意,您实际上并未在构造函数中为 row
和 seat_number
分配内存并保存它们。因此,调用您的 print_ticket
函数将导致未定义的行为。我建议您替换原始指针并将它们替换为 std::string
s:
std::string row;
std::string seat_number;
您现在可以将所有内容保存在构造函数中,而不必担心内存管理:
ShowTicket(const char* Row, const char* SeatNumber, bool SoldStatus = false) :
sold_status{SoldStatus},
row(Row),
seat_number(SeatNumber)
{}
您可能还想考虑将 row
和 seat_number
参数作为 const std::string&
s 或 std::string_view
s (C++17 起)使其更容易与一般人一起工作。
我在头文件中有一个class如下:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
class ShowTicket {
public:
bool is_sold(void){
if (sold_status == true){
return true;
}
else{
return false;
}
}
void sell_seat(void){
sold_status = true;
}
string print_ticket(void){
ostringstream sout;
if(sold_status == true){
sout<<row<<" "<<seat_number<<"sold";
}
else{
sout<<row<<" "<<seat_number<<"available";
}
return sout.str();
}
bool sold_status;
const char* row;
const char* seat_number;
ShowTicket(const char* Row, const char* SeatNumber):
sold_status{false},
row(Row),
seat_number(SeatNumber)
{}
};
测试这个class的主要函数如下:
#include <iostream>
#include <string>
#include <sstream>
#include "showticket.h"
using namespace std;
int main () {
ShowTicket myticket1("AA","101");
ShowTicket myticket2("AA","102");
if(!myticket1.is_sold())
myticket1.sell_seat ();
cout << myticket1.print_ticket() << endl;
cout << myticket2.print_ticket() << endl;
return 0;
}
创建 myticket 1 和 2 时出现错误“No matching constructor for initialization of 'ShowTicket”,但我相信我的构造函数接受这些参数,所以我不确定如何解决。
如有任何建议,我们将不胜感激。
从表面上看,您只想提供两个参数,但您的构造函数需要三个:
ShowTicket(const char* row, const char* seat_number, bool sold_status){
sold_status = false;
}
构造函数的主体让人相信您想要初始化一个新创建的 ShowTicket
,并将 sold_status
设置为 false
。您可以直接在成员初始值设定项列表中执行此操作:
ShowTicket(const char* row, const char* seat_number) : // note the colon
sold_status{false} // <- here
{}
如果不是这样,你可以让sold_status
有一个默认值,下面设置为false
:
ShowTicket(const char* row, const char* seat_number, bool sold_status = false) :
sold_status{sold_status}
{}
我还建议对参数和成员变量使用不同的名称。否则它很容易变得凌乱:
ShowTicket(const char* row, const char* seat_number, bool SoldStatus = false) :
sold_status{SoldStatus}
{}
另请注意,您实际上并未在构造函数中为 row
和 seat_number
分配内存并保存它们。因此,调用您的 print_ticket
函数将导致未定义的行为。我建议您替换原始指针并将它们替换为 std::string
s:
std::string row;
std::string seat_number;
您现在可以将所有内容保存在构造函数中,而不必担心内存管理:
ShowTicket(const char* Row, const char* SeatNumber, bool SoldStatus = false) :
sold_status{SoldStatus},
row(Row),
seat_number(SeatNumber)
{}
您可能还想考虑将 row
和 seat_number
参数作为 const std::string&
s 或 std::string_view
s (C++17 起)使其更容易与一般人一起工作。