exc_bad_access错误

时间:2011-05-03 17:30:30

标签: c++

我正在为家庭作业编写一个程序。该程序编译并运行,但访问错误。

这是main.cpp

#include <iostream>
#include <string>
#include "Mammal.h"
#include "Dog.h"
#include "Horse.h"
#include "Pig.h"
#include "Cat.h"

using namespace std;
//Seed for ease of grading
const int SEED=100;
const int NUM_ANIMALS=5;
const int WEIGHT_LIMIT=150;


void MammalAssignment(const Mammal * new_Mammal, int choice, string newName);
void UserChoice(const Mammal * new_Mammal);
void ListAnimal(const Mammal *new_Mammal);


int main()
{
    string newName, newWeight;

    srand(SEED);
    Mammal *new_Mammal[NUM_ANIMALS];

    UserChoice(*new_Mammal);
    for(int i=0; i<NUM_ANIMALS; i++)
        ListAnimal(new_Mammal[i]);



    //Program pauses for user input to continue
    char exit_char; 
    cout<<"\nPress any key and <enter> to exit\n";
    cin>>exit_char;

    return 0;
}

void UserChoice(const Mammal * new_Mammal)
{
    int choice;
    bool choiceGood;
    string newName;

    for(int i=0;i<NUM_ANIMALS; i++){
        choiceGood=false;
        while(choiceGood==false)
        {   
            cout<<"-Please choose a number 1-4 for the corresponding animal-\n"
                <<"1-Dog\n2-Horse\n3-Pig\n4-Cat\n";

            cin>>choice;  //User choice

            if(choice<=0 || choice >=5){
                cout<<"Your choice is invalid\n\n";
                continue;
            }

            choiceGood=true;
        } //While loop
        cout<<"\nPlease enter a name for the animal you have chosen(Ex. Fido).\n";
        cin>>newName;

        MammalAssignment(&new_Mammal[i], choice, newName);
    }  //For loop

}

void MammalAssignment(const Mammal * new_Mammal, int choice, string newName)
{
    if(choice==1){
        Dog newDog(rand()%(WEIGHT_LIMIT+1), newName);
        new_Mammal=&newDog;
    }
    else if(choice==2){
        Horse newHorse(rand()%(WEIGHT_LIMIT+1), newName);
        new_Mammal=&newHorse;
    }
    else if(choice==3){
        Pig newPig(rand()%(WEIGHT_LIMIT+1), newName);
        new_Mammal=&newPig;
    }
    else if(choice==4){
        Cat newCat(rand()%(WEIGHT_LIMIT+1), newName);
        new_Mammal=&newCat;
    }
}

void ListAnimal(const Mammal *new_Mammal)
{
    cout<<"-------------------------\nName:"
        <<new_Mammal->GetName()<<"\nWeight: "
        <<new_Mammal->GetWeight();
}

Mammal.h

#ifndef MAMMAL_H
#define MAMMAL_H

using namespace std;

class Mammal
{
public:
    Mammal(); //Default constructor

    Mammal( int newWeight);  //Parameterized constructor

    void SetWeight(int newWeight);

    virtual string GetName() const;

    int GetWeight() const;
    //virtual function to be  defined by derived animal classes
    virtual void Speak() const;
private:
    int weight;

};

#endif

Mammal.cpp

#include <iostream>
#include <string>
#include "Mammal.h"

using namespace std;

Mammal::Mammal()
{
    SetWeight(0);
    cout<<"\nInvoking default Mammal Constructor\n";
}

Mammal::Mammal( int newWeight)
{
    SetWeight(newWeight);
    cout<<"\nInvoking parameterized Mammal Constructor\n";
}

void Mammal::SetWeight(int newWeight)
{
    weight=newWeight;
}

int Mammal::GetWeight() const
{
    return weight;
}

string Mammal::GetName() const
{}

void Mammal::Speak() const
{
    cout<<"\nLadies and gentlemen, the mammal speaks...\n";
}

Dog.h

#ifndef DOG_H
#define DOG_H

#include "Mammal.h"

using namespace std;

class Dog: public Mammal
{
public:
    Dog(); //Default constructor

    Dog(const int& newWeight,const string& newName);  //Parameterized constructor

    void SetName(string newName);

    string GetName() const;
    //mammal virtual function 
    virtual void Speak() const;

private:
    string name;
};

#endif

Dog.cpp

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

using namespace std;
//Default constructor
Dog::Dog()
{
    cout<<"\nInvoking default Dog constructor\n";
}
//Parameterized constructor
Dog::Dog( const int& newWeight,const string& newName):Mammal(newWeight)  
{
    SetName(newName);
    cout<<"\nInvoking parameterized Dog constructor.\n";
}

void Dog::SetName(string newName)
{
    name=newName;
}

string Dog::GetName() const
{
    return name;
}
//mammal virtual function 
void Dog::Speak() const
{
    Mammal::Speak();
    cout<<"\nWoof!\n";
}

其他派生类(马,猪和猫)都与狗相同。当ListAnimals()到达GetWeight()时,我收到Exc_Bad_Access错误。据我所知,它返回正确的文件类型。任何帮助都很棒

2 个答案:

答案 0 :(得分:6)

您的MammalAssignment函数正在返回指向局部变量的指针。一旦函数返回,那个内存(在堆栈中)就会消失,当你将它作为相关哺乳动物类型的对象访问时,你将崩溃。

假设在operator new类中实现了合适的复制语义,则需要返回指向使用Mammal分配的内存的指针,或者可能只是一个对象而不是指针。

在您继续学习之前,C ++中的内存管理修订(或初始自学?)将是有序的。另请参阅smart pointers,尽可能避免new/delete,让您的生活更轻松。

答案 1 :(得分:1)

Mammal *new_Mammal[NUM_ANIMALS];

你需要使用new来分配内存!

Mammal *new_Mammal = new Mammal[NUM_ANIMALS];

另外我认为你的UserChoice函数应该将指针作为参考而不是const值才能改变实际内容。