为什么我的代码在运行时给我一个stackdump错误?

用户3492502

我们应该使动物类继承自不同类型动物的类,即Dog类将从Carnivore类继承,而Carnivore类将从Mammal类继承。我尝试在自己的主函数中使用班级,它们打印出应该说的内容和名称,但是当我使用老师的主文件运行班级时,它会告诉我其转储堆栈的踪迹。

#include <iostream>
#include <string>
#include <typeinfo>
#include <vector>

using namespace std;

class Mammal {
public:
    virtual string say() = 0;
    virtual string name() = 0;
};

class Carnivore : public Mammal {
public:
    virtual string say() = 0;
    virtual string name() = 0;
};

class Canid : public Carnivore{
public:
    virtual string say() = 0;
    virtual string name() = 0;
};

class Dog : public Canid{
public:
    string say(){
        return "bark";
    }
    string name(){
        return "dog";
    }
};

class Fox : public Canid{
public:
    Fox(){
        spoke = "ay";
    }
    std::string say(){
        spoke += spoke;
        return spoke;
    }
    std::string name(){
        return "fox";
    }
private:
    std::string spoke;
};

class Feline : public Canid{
public: 
    virtual string say() = 0;
    virtual string name() = 0;
 };

class Cat : public Feline{
public:
    std::string say(){
        return "moew";
    }
    std::string name(){
        return "cat";
    }
};

class Rodent : public Mammal{
public: 
    virtual string say() = 0;
    virtual string name() = 0;
};

class Mouse : public Rodent{
public:
    std::string say(){
        return "squeak";
    }
    std::string name(){
        return "mouse";
    }
};

Mammal* MammalFactory(const std::type_info& ti){

    if(ti == typeid(Dog)){
        cout << "running dog" << endl;
        Dog D;
        Mammal* dog = &D;
        return dog;
    }
    else if (ti == typeid(Fox)){
        cout << "running fox" << endl;
        Fox F;
        Mammal* fox = &F;
        return fox;
    }
    else if (ti == typeid(Cat)){
        cout << "running cat" << endl;
        Cat C;
        Mammal* cat = &C;
        return cat;
    }
    else if (ti == typeid(Mouse)){
        cout << "running mouse" << endl;
        Mouse M;
        Mammal* mouse = &M;
        return mouse;
    }
    else{
        return NULL;
    }
}

int main(){

    int score = 90;
    std::vector<Mammal*> mammals;
    mammals.push_back(MammalFactory(typeid(Dog)));
    mammals.push_back(MammalFactory(typeid(Cat)));
    mammals.push_back(MammalFactory(typeid(Mouse)));
    Mammal* fox = MammalFactory(typeid(Fox));

    mammals.at(0)->name();

    for (std::vector<Mammal*>::iterator I = mammals.begin(); I != mammals.end(); ++I) {
        std::cout<<(*I)->name()<<" goes "<<(*I)->say()<<'\n';
    }

    //Check animal names
    if (mammals.at(0)->name() != "dog") {
        std::cout<<"Dog's name is incorrect! -10\n";
        score -= 10;
    }
    if (mammals.at(1)->name() != "cat") {
        std::cout<<"Cat's name is incorrect! -10\n";
        score -= 10;
    }
    if (mammals.at(2)->name() != "mouse") {
        std::cout<<"Mouse's name is incorrect! -10\n";
        score -= 10;
    }
    if (fox->name() != "fox") {
        std::cout<<"Fox's name is incorrect! -10\n";
        score -= 10;
    }

    //Fox part

    std::string thing1 = fox->say();
    std::string thing2 = fox->say();

    std::cout<<"What does the "<<fox->name()<<" say?\n";
    std::cout<<thing1<<"!\n";
    std::cout<<thing1<<"!\n";
    std::cout<<thing1<<"!\n";
    std::cout<<"What does the "<<fox->name()<<" say?\n";
    std::cout<<thing2<<"!\n";
    std::cout<<thing2<<"!\n";
    std::cout<<thing2<<"!\n";

    if (thing1 == thing2) {
        std::cout<<"Foxes don't say the same thing twice!\n";
        score -= 10;
    }

    for (std::vector<Mammal*>::iterator I = mammals.begin(); I != mammals.end(); ++I) {
        delete *I;
    }
    delete fox;
    return 0;
}
保罗·麦肯齐

除了析构函数不是虚拟的之外,您还要返回局部变量的地址。这是未定义的行为。

Mammal* MammalFactory(const std::type_info& ti)
{
    if(ti == typeid(Dog))
    {
        cout << "running dog" << endl;
        Dog D;
        Mammal* dog = &D;
        return dog;  // so what happens to D when MammalFactory returns?
    }
}

对于所有其他派生类,您也会犯同样的错误。该函数返回后,将不再有“ D”。它变得一团雾气,您正在返回该变量不再存在的地址。

要么创建一个新的Mammal(return new Dog;),要么想出一种创建Dog并返回不属于本地的Dog的方法(同样,问题不仅仅与该类有关,而是所有其他类都将涉及)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我的程序在运行时给我错误的输出?

来自分类Dev

向量迭代器擦除给我一个运行时错误?

来自分类Dev

为什么我们需要在运行时实例化一个类型?

来自分类Dev

为什么我的代码出现运行时错误?

来自分类Dev

为什么我的代码给出运行时错误?

来自分类Dev

我创建了一个空结构并在字典中添加了这种类型的变量:为什么编译器编译代码并且我在运行时得到一个重复的异常?

来自分类Dev

为什么我的SKAudioNode给我一个错误?

来自分类Dev

为什么我可以在运行时通过 ClassName.__init__(self) 初始化另一个类来扩展一个类

来自分类Dev

我想实现一个双向循环链表-代码中的运行时错误

来自分类Dev

在 VBA 中将列表框作为函数参数传递给我一个运行时错误 13

来自分类Dev

为什么这if语句给我一个错误

来自分类Dev

为什么triggerHandler(event)给我一个错误?

来自分类Dev

为什么此代码序列给我一个错误102

来自分类Dev

为什么这个html代码给我一个错误?

来自分类Dev

为什么以下sass代码给我一个错误?

来自分类Dev

为什么我的代码给我一个值而不是一个列表

来自分类Dev

为什么在运行时在Iterator trait对象上调用next给我“内存不足”?

来自分类Dev

当我看到代码正确运行时,为什么代码仍将字符串打印到另一个文件?

来自分类Dev

你能弄清楚为什么我的代码给我一个 IndexOutOfBounds 错误吗?

来自分类Dev

不明白为什么我的代码给我一个IndexError

来自分类Dev

为什么我在 Xcode 上收到以下代码的 (lldb) 运行时错误?

来自分类Dev

为什么我的条件运算符给我一个错误?

来自分类Dev

为什么我在Python中的if语句给我一个错误?

来自分类Dev

为什么我的Scan.nextDouble给我一个Java错误?

来自分类Dev

为什么我的混合(C++、asm)程序给我一个分段错误?

来自分类Dev

我写了一些代码来找到一个阿姆斯特朗数,我不知道为什么它没有给我错误的输出?

来自分类Dev

我刚接触黄瓜。我正在运行两个功能文件。运行时显示错误。如果我只运行第一个标签,它运行良好

来自分类Dev

每当我尝试移动按钮时,都会在运行时给我XML错误

来自分类Dev

我不完全确定我的代码有什么问题,我的IDE给我一个错误

Related 相关文章

  1. 1

    为什么我的程序在运行时给我错误的输出?

  2. 2

    向量迭代器擦除给我一个运行时错误?

  3. 3

    为什么我们需要在运行时实例化一个类型?

  4. 4

    为什么我的代码出现运行时错误?

  5. 5

    为什么我的代码给出运行时错误?

  6. 6

    我创建了一个空结构并在字典中添加了这种类型的变量:为什么编译器编译代码并且我在运行时得到一个重复的异常?

  7. 7

    为什么我的SKAudioNode给我一个错误?

  8. 8

    为什么我可以在运行时通过 ClassName.__init__(self) 初始化另一个类来扩展一个类

  9. 9

    我想实现一个双向循环链表-代码中的运行时错误

  10. 10

    在 VBA 中将列表框作为函数参数传递给我一个运行时错误 13

  11. 11

    为什么这if语句给我一个错误

  12. 12

    为什么triggerHandler(event)给我一个错误?

  13. 13

    为什么此代码序列给我一个错误102

  14. 14

    为什么这个html代码给我一个错误?

  15. 15

    为什么以下sass代码给我一个错误?

  16. 16

    为什么我的代码给我一个值而不是一个列表

  17. 17

    为什么在运行时在Iterator trait对象上调用next给我“内存不足”?

  18. 18

    当我看到代码正确运行时,为什么代码仍将字符串打印到另一个文件?

  19. 19

    你能弄清楚为什么我的代码给我一个 IndexOutOfBounds 错误吗?

  20. 20

    不明白为什么我的代码给我一个IndexError

  21. 21

    为什么我在 Xcode 上收到以下代码的 (lldb) 运行时错误?

  22. 22

    为什么我的条件运算符给我一个错误?

  23. 23

    为什么我在Python中的if语句给我一个错误?

  24. 24

    为什么我的Scan.nextDouble给我一个Java错误?

  25. 25

    为什么我的混合(C++、asm)程序给我一个分段错误?

  26. 26

    我写了一些代码来找到一个阿姆斯特朗数,我不知道为什么它没有给我错误的输出?

  27. 27

    我刚接触黄瓜。我正在运行两个功能文件。运行时显示错误。如果我只运行第一个标签,它运行良好

  28. 28

    每当我尝试移动按钮时,都会在运行时给我XML错误

  29. 29

    我不完全确定我的代码有什么问题,我的IDE给我一个错误

热门标签

归档