在 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} 
{}

另请注意,您实际上并未在构造函数中为 rowseat_number 分配内存并保存它们。因此,调用您的 print_ticket 函数将导致未定义的行为。我建议您替换原始指针并将它们替换为 std::strings:

        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)
{}

您可能还想考虑将 rowseat_number 参数作为 const std::string&s 或 std::string_views (C++17 起)使其更容易与一般人一起工作。