2011-05-03 74 views
0

我正在编写作业作业的程序。该程序编译并运行,但访问错误不正确。exc_bad_access错误

这是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错误。据我可以告诉它正在返回正确的文件类型。任何帮助将是可怕的

回答

4

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

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

C++中的内存管理修订(或初始自我教育?)将在您继续之前进行。请参阅smart pointers,尽可能避免new/delete,并让您的生活更轻松。

+0

谢谢,我想我现在对它有了更好的理解。 – ChadM 2011-05-03 17:57:56

1
Mammal *new_Mammal[NUM_ANIMALS]; 

您需要分配内存使用新!

Mammal *new_Mammal = new Mammal[NUM_ANIMALS]; 

此外,我认为你的UserChoice函数应该把指针作为参考,而不是一个const值,以便能够改变实际内容。