为什么我会收到“没有匹配的构造函数错误?
Why do I get a "no matching constructor error?
我希望我的代码采用 name
、mail
和 car
作为参数类型,我尝试在名为 [=16] 的 class 中这样做=].在 main()
中,我尝试给 class 一个变量 a
,稍后我可以在 cout
中调用它。但是,我得到了这个确切的错误:
no matching constructor for initialization of "Person"
我该如何解决这个问题?
h。文件
#pragma once
#include <iostream>
#include "car.h"
#include <string>
class Person{
private:
std::string name;
std::string mail;
Car* car;
public:
Person(std::string name, std::string mail);
Person(std::string name, std::string, Car* car);
void setMail(std::string mail);
std::string getMail() const;
std::string getName() const;
bool hasAvailableFreeSeats();
friend std::ostream& operator <<(std::ostream& os, const Person& person);
};
cpp 文件:
#include "person.h"
std::string Person:: getMail() const{
return mail;
}
std:: string Person:: getName() const{
return name;
}
void Person:: setMail(std::string mail){
this -> mail = mail;
}
Person:: Person(std::string name, std::string mail) : Person(name, mail, nullptr){};
Person::Person(std::string name, std::string, Car* car) : name{name}, mail{mail}, car{car}{};
bool Person:: hasAvailableFreeSeats(){
if (car != nullptr){
return car-> hasFreeSeats();
}
}
std::ostream& operator <<(std::ostream& os, const Person& person){
return os << person.name << ": " << person.mail << "\n";
}
主要内容:
#include "person.h"
int main(){
std::string name{"Ola Normann"};
std::string mail{"ola.normann@norge.no"};
std::unique_ptr<Car> car{new Car{5}};
Person a{name, mail, std::move(car)};
};
首先,您的 3 参数 Person
构造函数中有错字。第二个参数没有分配给它的名称,所以你最终用它自己初始化 mail
class 成员,而不是调用者的输入:
Person::Person(std::string name, std::string, Car* car) : name{name}, mail{mail}, car{car}{};
^ no name here! ^ member!
应该是这样的:
Person::Person(std::string name, std::string mail, Car* car) : name{name}, mail{mail}, car{car}{};
^ has a name now! ^ parameter!
现在,话虽如此,您的 main()
代码正在将 3 个值传递给 Person
构造函数:
Person a{name, mail, std::move(car)};
你的Person
class只有1个接受3个参数的构造函数:
Person(std::string name, std::string, Car* car);
在 main()
中,您的 name
和 mail
变量是 std::string
对象,这很好,但是您的 car
变量是 std::unique_ptr<Car>
对象,而不是 Car*
指针。 std::move(car)
将 return 一个 std::unique_ptr<Car>&&
右值引用,Person
不接受,因此编译器错误。 std::unique_ptr
不能隐式转换为原始指针。您将不得不改用其 get()
方法:
Person a{name, mail, car.get()};
这首先违背了使用 std::unique_ptr
的目的。您应该改为更改 Person
class 以保存 std::unique_ptr
对象而不是原始指针,例如:
.h
#pragma once
#include <iostream>
#include <string>
#include <memory>
#include "car.h"
class Person{
private:
std::string name;
std::string mail;
std::unique_ptr<Car> car;
public:
...
Person(std::string name, std::string mail);
Person(std::string name, std::string mail, std::unique_ptr<Car> car);
...
};
.cpp
#include "person.h"
...
Person::Person(std::string name, std::string mail) : Person(name, mail, nullptr){};
Person::Person(std::string name, std::string, std::unique_ptr<Car> car) : name{name}, mail{mail}, car{std::move(car)}{};
...
主要
#include "person.h"
int main(){
std::string name{"Ola Normann"};
std::string mail{"ola.normann@norge.no"};
std::unique_ptr<Car> car{new Car{5}};
Person a{name, mail, std::move(car)};
// alternatively:
// Person a{name, mail, std::make_unique<Car>(5)};
};
我希望我的代码采用 name
、mail
和 car
作为参数类型,我尝试在名为 [=16] 的 class 中这样做=].在 main()
中,我尝试给 class 一个变量 a
,稍后我可以在 cout
中调用它。但是,我得到了这个确切的错误:
no matching constructor for initialization of "Person"
我该如何解决这个问题?
h。文件
#pragma once
#include <iostream>
#include "car.h"
#include <string>
class Person{
private:
std::string name;
std::string mail;
Car* car;
public:
Person(std::string name, std::string mail);
Person(std::string name, std::string, Car* car);
void setMail(std::string mail);
std::string getMail() const;
std::string getName() const;
bool hasAvailableFreeSeats();
friend std::ostream& operator <<(std::ostream& os, const Person& person);
};
cpp 文件:
#include "person.h"
std::string Person:: getMail() const{
return mail;
}
std:: string Person:: getName() const{
return name;
}
void Person:: setMail(std::string mail){
this -> mail = mail;
}
Person:: Person(std::string name, std::string mail) : Person(name, mail, nullptr){};
Person::Person(std::string name, std::string, Car* car) : name{name}, mail{mail}, car{car}{};
bool Person:: hasAvailableFreeSeats(){
if (car != nullptr){
return car-> hasFreeSeats();
}
}
std::ostream& operator <<(std::ostream& os, const Person& person){
return os << person.name << ": " << person.mail << "\n";
}
主要内容:
#include "person.h"
int main(){
std::string name{"Ola Normann"};
std::string mail{"ola.normann@norge.no"};
std::unique_ptr<Car> car{new Car{5}};
Person a{name, mail, std::move(car)};
};
首先,您的 3 参数 Person
构造函数中有错字。第二个参数没有分配给它的名称,所以你最终用它自己初始化 mail
class 成员,而不是调用者的输入:
Person::Person(std::string name, std::string, Car* car) : name{name}, mail{mail}, car{car}{};
^ no name here! ^ member!
应该是这样的:
Person::Person(std::string name, std::string mail, Car* car) : name{name}, mail{mail}, car{car}{};
^ has a name now! ^ parameter!
现在,话虽如此,您的 main()
代码正在将 3 个值传递给 Person
构造函数:
Person a{name, mail, std::move(car)};
你的Person
class只有1个接受3个参数的构造函数:
Person(std::string name, std::string, Car* car);
在 main()
中,您的 name
和 mail
变量是 std::string
对象,这很好,但是您的 car
变量是 std::unique_ptr<Car>
对象,而不是 Car*
指针。 std::move(car)
将 return 一个 std::unique_ptr<Car>&&
右值引用,Person
不接受,因此编译器错误。 std::unique_ptr
不能隐式转换为原始指针。您将不得不改用其 get()
方法:
Person a{name, mail, car.get()};
这首先违背了使用 std::unique_ptr
的目的。您应该改为更改 Person
class 以保存 std::unique_ptr
对象而不是原始指针,例如:
.h
#pragma once
#include <iostream>
#include <string>
#include <memory>
#include "car.h"
class Person{
private:
std::string name;
std::string mail;
std::unique_ptr<Car> car;
public:
...
Person(std::string name, std::string mail);
Person(std::string name, std::string mail, std::unique_ptr<Car> car);
...
};
.cpp
#include "person.h"
...
Person::Person(std::string name, std::string mail) : Person(name, mail, nullptr){};
Person::Person(std::string name, std::string, std::unique_ptr<Car> car) : name{name}, mail{mail}, car{std::move(car)}{};
...
主要
#include "person.h"
int main(){
std::string name{"Ola Normann"};
std::string mail{"ola.normann@norge.no"};
std::unique_ptr<Car> car{new Car{5}};
Person a{name, mail, std::move(car)};
// alternatively:
// Person a{name, mail, std::make_unique<Car>(5)};
};