首先,你的3参数有一个输入错误
Person
建造师。第二个参数没有指定名称,因此您最终会初始化
mail
类成员,而不是调用方的输入:
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 a{name, mail, std::move(car)};
你的
人
类只有一个接受3个参数的构造函数:
Person(std::string name, std::string, Car* car);
在里面
main()
你的
name
和
邮政
变量是
std::string
对象,这很好,但你的
car
变量是一个
std::unique_ptr<Car>
对象,而不是
Car*
指针。
std::move(car)
将返回
std::unique_ptr<Car>&&
右值引用
人
不接受,因此出现编译器错误。
std::unique_ptr
不能隐式转换为原始指针。你必须使用它的
get()
方法:
Person a{name, mail, car.get()};
这违背了使用
std::unique_ptr
首先。你应该改成
人
班级举行
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)};
};