没有用于调用 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 &
传递,以避免不必要的复制。
错误:说明资源路径位置类型 没有匹配函数调用 '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 &
传递,以避免不必要的复制。