无法使用“dog *”类型的右值初始化“pet *”类型的变量

问题描述 投票:0回答:1

我正在为学校作业创建一个“宠物店系统”。我将在代码下方留下完整的说明,但摘要是:

我应该使用指针、头文件、OOP 和继承等概念才能做到这一点。基本上,系统将饲养宠物,无论是狗还是猫,并显示其名称和许可费(由宠物的重量决定 - 狗为 2 美元/磅,猫为 1.50 美元/磅)。

在我的

main()
函数中,我试图创建一个指向
pet
类的指针向量,并且要求我创建 3 个宠物实例;两只狗,一只猫。我试图将它们的每个指针存储在向量中。

问题是,我正在使用它们的狗和猫类创建它们,但我希望它们存储为宠物指针。我在尝试创建狗实例时收到此错误,例如:

无法使用“dog *”类型的右值初始化“pet *”类型的变量

我已将

pet*
更改为
dog*
但所做的只是给了我一条不同的错误消息:

没有匹配的成员函数来调用“push_back”

我不知道如何解决这个问题,以便我可以指定宠物是哪种动物,但将它们作为指针存储在我的

pvec
向量中。

以下是我的文件的最小化版本(我关注的部分),以及作业提示的说明:

main.cpp:

#include <iostream>
#include <string>
#include <vector>
#include "pet.hpp"
#include "dog.hpp"
#include "cat.hpp"

using namespace std;

int main() {
    vector<pet*> pvec; //creates a list of pointers to pets

    //creating 3 pets to test program, two dogs and one cat
    pet* bob = new dog("Bob", 65, 0.0); //uses constructors from dog class, setting initial price to 0
    pvec.push_back(bob); //adds bob to the vector
    pet* stan = new dog("Stan", 37, 0.0);
    pvec.push_back(stan);
    pet* tom = new cat("Tom", 12, 0.0);
    pvec.push_back(tom);

pet.cpp,反映pet头文件

pet.hpp:

#ifndef pet_hpp
#define pet_hpp

#include <string>

using namespace std;

class pet {
public:
    pet();
    pet(string name, int weight, float price);
    void SetName(string name) {
        pet_name = name;
    }
    string GetName() {
        return pet_name;
    }
    void SetWeight(int weight) {
        pet_weight = weight;
    }
    string GetWeight() {
        return pet_name;
    }
    void SetPrice(float price) {
        pet_price = price;
    }
    static float GetPrice() {
        return pet_price;
    };
private:
    string pet_name;
    int pet_weight;
    static float pet_price;
};

#endif //pet_hpp

dog.cpp,反映狗头

狗.hpp:

#ifndef dog_hpp
#define dog_hpp

#include <string>
#include <iostream>
#include "pet.hpp"

using namespace std;

class dog : public pet {
public:
    dog();
    dog(string name, int weight, float price);
    void SetName(string name) {
        dog_name = name;
    }
    string GetName() {
        return dog_name;
    }
    void SetWeight(int weight) {
        dog_weight = weight;
    }
    int GetWeight() {
        return dog_weight;
    }
    void SetPrice(float price) {
        dog_price = price;
    }
    float GetPrice() {
        return dog_price;
    }
    static float licensing_rate;
private:
    string dog_name;
    int dog_weight;
    float dog_price;
};

float dog::licensing_rate = 2.0; //sets the rate for dogs at $2 a pound

#endif //dog_hpp

cat.cpp,反映cat头

cat.hpp:

#ifndef cat_hpp
#define cat_hpp

#include <string>
#include "pet.hpp"

using namespace std;

class cat : public pet {
public:
    cat();
    cat(string name, int weight, float price);
    void SetName(string name) {
        cat_name = name;
    }
    string GetName() {
        return cat_name;
    }
    void SetWeight(int weight) {
        cat_weight = weight;
    }
    int GetWeight() {
        return cat_weight;
    }
    void SetPrice(float price) {
        cat_price = price;
    }
    float GetPrice() {
        return cat_price;
    }
    static float licensing_rate;
private:
    string cat_name;
    int cat_weight;
    float cat_price = cat_weight;
};

float cat::licensing_rate = 1.50;

#endif //cat_hpp

分配说明:

宠物店需要跟踪其宠物,包括狗和猫。每种宠物(狗、 猫)的每月许可费率为每只宠物的“每磅”体重。该商店想要一个系统来跟踪他们的宠物并计算他们每月支付的许可费总额。

你需要设计并构建这样一个系统。您的主函数应该有一个循环来计算总费用,如下所示:

float total_fee = 0.0;
for (int i = 0; i < pvec.size(); i++)
{
cout << pvec[i]->GetName() << ' ' << pvec[i]->CalculateFee() << endl;
total_fee = total_fee + pvec[i]->CalculateFee();
}
cout << "total licensing fee = " << total_fee << endl;

其中

pvec
Pet
指针的 C++ 向量。函数
CalculateFee
应该是虚函数,
Pet
应该是抽象基类。许可率可能应该被建模为每种宠物的静态类变量。在继承层次结构中组织您的类,以重用尽可能多的代码。

要测试系统,您可以在主函数中创建三个宠物:

  1. 一只 65 磅重的狗,名叫鲍勃,
  2. 一只 37 磅重的狗,名叫斯坦,
  3. 一只 12 磅重的猫,名叫汤姆。

狗的许可费率可以设置为 2 美元/磅,猫的许可费率可以设置为 1.50 美元/磅。

输出应该是:

Bob 130
Stan 74
Tom 18
total licensing fee = 222
c++ pointers inheritance vector
1个回答
0
投票

您误解了继承的工作原理。您在

pet
中提供的变量和函数不应在
cat
dog
中重复。他们会自动继承这种行为。您在
cat
dog
中唯一需要的是它们独有的东西 - 在本例中是许可费的计算。此外,您的
GetWeight
SetWeight
代码试图获取名称——剪切和粘贴错误。此外,您在dog.hpp和cat.hpp中使用符号
pet_hpp
作为保护器,这意味着这些文件永远不会被包含在内。

此代码有效。

pet.hpp:

#ifndef pet_hpp
#define pet_hpp

#include <string>

using namespace std;

class pet {
public:
    pet(string name, int weight, float price)
        : pet_name(name)
        , pet_weight(weight)
        , pet_price(price)
    {
    }
    void SetName(string name) {
        pet_name = name;
    }
    string GetName() {
        return pet_name;
    }
    void SetWeight(int weight) {
        pet_weight = weight;
    }
    int GetWeight() {
        return pet_weight;
    }
    void SetPrice(float price) {
        pet_price = price;
    }
    float GetPrice() {
        return pet_price;
    };

    virtual float CalculateFee() = 0;
private:
    string pet_name;
    int pet_weight;
    float pet_price;
};

#endif //pet_hpp

狗.hpp:

#ifndef dog_hpp
#define dog_hpp

#include <string>
#include "pet.hpp"

using namespace std;

class dog : public pet {
public:
    dog(string name, int weight, float price)
        : pet(name, weight, price)
    {}
    virtual float CalculateFee()
    {
        return licensing_rate * GetWeight();
    }
    static float licensing_rate;
};

float dog::licensing_rate = 2.0; //sets the rate for dogs at $2 a pound

#endif

cat.hpp:

#ifndef cat_hpp
#define cat_hpp

#include <string>
#include "pet.hpp"

using namespace std;

class cat : public pet {
public:
    cat(string name, int weight, float price)
        : pet(name, weight, price)
    {}
    virtual float CalculateFee()
    {
        return licensing_rate * GetWeight();
    }
    static float licensing_rate;
};

float cat::licensing_rate = 1.50;

#endif

main.cpp:

#include <iostream>
#include <string>
#include <vector>
#include "pet.hpp"
#include "dog.hpp"
#include "cat.hpp"

using namespace std;

int main() {
    vector<pet*> pvec; //creates a list of pointers to pets

    //creating 3 pets to test program, two dogs and one cat
    pet* bob = new dog("Bob", 65, 0.0f); 
    pvec.push_back(bob); //adds bob to the vector
    pet* stan = new dog("Stan", 37, 0.0f);
    pvec.push_back(stan);
    pet* tom = new cat("Tom", 12, 0.0f);
    pvec.push_back(tom);

    float total_fee = 0.0;
    for (int i = 0; i < pvec.size(); i++)
    {
        cout << pvec[i]->GetName() << ' ' << pvec[i]->CalculateFee() << endl;
        total_fee = total_fee + pvec[i]->CalculateFee();
    }
    cout << "total licensing fee = " << total_fee << endl;
}

输出:

Bob 130
Stan 74
Tom 18
total licensing fee = 222
© www.soinside.com 2019 - 2024. All rights reserved.