代码之家  ›  专栏  ›  技术社区  ›  Kaku

为什么会出现“无匹配构造函数错误”?

  •  0
  • Kaku  · 技术社区  · 2 年前

    我想让我的代码 name , mail car 作为参数类型,我尝试在名为 Person 在里面 main() ,我试着给那个类一个变量 a 我可以稍后再打给你 cout .然而,我得到了一个确切的错误:

    没有用于“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)};
    };
    
    1 回复  |  直到 2 年前
        1
  •  0
  •   Remy Lebeau    2 年前

    首先,你的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)};
    };