首页 > 解决方案 > 为什么我会收到“无匹配功能”错误?

问题描述

对 C++ 来说非常新,我得到的任务基本上是关于使用两个不同的类,但是在创建我的头文件和 C++ 文件并尝试编译时,我收到一个错误,读取没有匹配函数调用'Owner::Owner( )'。由于我对 C++ 不是很熟悉,但我假设这个问题与我的构造函数以及我尝试调用它们的方式有关,我的分配详细说明了我认为我的问题是什么,但我无法准确理解是什么需要完成。我将提供有关该问题的分配详细信息,以及下面的代码和编译错误。对不起,我刚刚被这个问题困扰了一段时间,我似乎无法找到解决方案。

编译错误图像

构造函数'Dog :: Dog(std :: __cxx11 :: string,int)'中的转录错误:Dog.cpp:23:46:错误:没有匹配函数调用'Owner :: Owner()'Dog :: Dog (std::string unsetBreed, int unsetAge){

作业详情

现在您将编写一个由两个类组成的程序,一个 Dog 类和一个 Owner 类。它们的规范显示在下面的 UML 图中。请注意,在我们的设计中,每个 Dog 都有一个 Owner 类成员。如上所述,类所有者是不可变的。不可变类只是在实例化对象后其成员无法更改(变异)的类。因此,Owner 类没有任何 setter 方法。Owner 的类属性必须在创建时设置(在 Owner 的构造函数中)。您将从 Dog 的构造函数内部调用 Owner 的构造函数。不要忘记在 Dog 类的每个构造函数中执行此操作。

UML 图

Dog.h 文件

#ifndef DOG_H_INCLUDED
#define DOG_H_INCLUDED

#include <iostream>
#include "Owner.h"


class Dog {
//-----------------------//
  private:
    std::string breed;
    int age;
    Owner owner;
    static int dogCount;
//-----------------------//
  public:
    Dog();
    Dog(std::string, int);
    std::string getBreed();
    int getAge();
    void setBreed(std::string);
    void setAge(int);
    void printDogInfo();
    int getDogCount();
};
#endif // DOG_H_INCLUDED

所有者.h 文件

#ifndef OWNER_H_INCLUDED
#define OWNER_H_INCLUDED
#include <iostream>

class Owner {
//-----------------------//
  private:
    std::string name;
    int age;
//-----------------------//
  public:
    Owner(std::string, int);
    std::string getName();
    int getAge();
//-----------------------//
};


#endif // OWNER_H_INCLUDED

Dog.cpp 文件

#include <iostream>
#include "Owner.cpp"
#include "Owner.h"
#include "Dog.h"

//---------------SETTERS------------------//
void Dog::setBreed(std::string dogBreed){dogBreed = breed;}
void Dog::setAge(int dogAge){dogAge = age;}





//--------------GETTERS------------------//
std::string Dog::getBreed(){return breed;}
int Dog::getAge(){return age;}
int Dog::getDogCount(){return dogCount;}




//--------------OTHERS-------------------//
Dog::Dog(std::string unsetBreed, int unsetAge){
  Owner::Owner(std::string unsetName, int unsetOwnerAge);
  Dog::setBreed(unsetBreed);
  Dog::setAge(unsetAge);
}

void Dog::printDogInfo(){
  Dog::getBreed();
  Dog::getAge();
}

所有者.cpp 文件

#include <iostream>
#include "Owner.h"
#include "Dog.h"

//--------------GETTERS------------------//
int Owner::getAge(){return age;}
std::string Owner::getName(){return name;}


//--------------OTHERS-------------------//
Owner::Owner(std::string unsetName, int unsetOwnerAge){
  Owner::getName();
  Owner::getAge();
}

标签: c++classobject

解决方案


这里的问题是您没有接收 0 个参数的构造函数。您有 2 个选项:

1 - 定义其他构造函数:

//header file
class Owner {
...
  public:
    Owner(std::string, int);
    Owner();
...
};
//cpp file
...
Owner::Owner(){
  name = "Jhon Doe";
  age = 18;
}
...

2 - 定义默认参数:

//header file
class Owner {
...
  public:
    Owner(std::string unsetName = "John Doe", int unsetAge = 18);
...
};
//cpp file
...
Owner::Owner(std::string unsetName = "John Doe", int unsetAge = 18);
  Owner::getName();
  Owner::getAge();
}
...

注意:我不知道你为什么在构造函数中调用 getter。


推荐阅读