没有用于调用 CLASS:CLASSCPP(C++) 的匹配函数

no matching function for call to CLASS:CLASSCPP(C++)

错误:说明资源路径位置类型 没有匹配函数调用 'Saat::Saat()' Ucus.cpp /project9/src 第 4 行 C/C++ 问题

这个我的 class 叫 Saat

#ifndef SAAT_H_
#define SAAT_H_
#include <string>

class Saat {
public:
    Saat(int, int);
    std::string to_string() const;
private:
    int saat, dakika;
};

#endif /* SAAT_H_ */

#include "Saat.h"

Saat::Saat(int s, int d){
    saat = s;
    dakika = d;
}
std::string Saat::to_string() const{
    return std::to_string(saat) + ":" + std::to_string(dakika);
}

这是我的 class 叫 Ucus

#ifndef UCUS_H_
#define UCUS_H_
#include <string>
#include "Saat.h"

class Ucus {
public:
    Ucus(std::string, std::string, std::string, Saat);
    static int get_ucus_sayisi();
    std::string to_string();
private:
    std::string cikisSehir;
    std::string varisSehir;
    std::string ucusNo;
    Saat kalkis_saati;
    static int ucus_sayisi;
};

#endif /* UCUS_H_ */

#include "Ucus.h"

/*ERROR IS HERE */Ucus::Ucus(std::string cs, std::string vs, std::string un, Saat s) { 
    cikisSehir = cs;
    varisSehir = vs;
    ucusNo = un;
    kalkis_saati = s;


}
int Ucus::get_ucus_sayisi(){
    return ucus_sayisi;

}
std::string Ucus::to_string(){
    return cikisSehir + varisSehir + ucusNo + kalkis_saati.to_string();
}

我正在观看有关 classes 的视频,我想在 Ucus class 中使用我的 Saat class。 我在视频中做同样的事情,但它给了我这个错误: ***( 描述资源路径位置类型没有匹配函数调用 'Saat::Saat()' Ucus.cpp /project9/src 第 4 行 C/C++ 问题 )


没有什么不同,但不适合我。

在class中,成员是在进入构造函数体之前创建的。 您的代码试图默认构造一个 Saat,然后通过赋值在主体中覆盖它。

因为您的 Saat class 没有默认构造函数,所以您的代码无法编译。为什么您的 class 没有默认构造函数?如果您不提供任何构造函数,编译器可以为您生成一个,但是一旦您编写了一个,默认构造函数将不再提供,无需请求。但如果这个编译你会稍微差一点。发现错误而不是默默忍受错误是件好事。

正确的方法是不默认构造您的对象,而是 copy-construct 它和构造函数成员初始化列表中的其他成员:

Ucus::Ucus(std::string cs, std::string vs, std::string un, Saat s)
  cikisSehir{cs},
  varisSehir{vs},
  ucusNo{un},
  kalkis_saati{s},
{ 
}

效率也更高。没有理由创建一个对象,然后通过赋值覆盖它。最好通过副本直接创建它,一个你会自动生成的构造函数(除非你有一个不可复制的成员,但在你的情况下你没有。)

当然,您确实应该考虑将字符串作为 std::string const & 传递,以避免不必要的复制。