所以我最近又重新开始编程,为我去年的物理学做准备,我遇到了一些例子。
它说我需要添加代码中显示的特定Exhibit类,然后实现这些功能。然后它希望我将其显示为输出;
Max says Eeeeep
Jack says Roar
Petals says Woof
{ Max Jack Batty Sheepy Hippopotamusesy Turkey }
{ Max Jack Batty Sheepy Hippopotamusesy Turkey }
重载<<
运算符。
我已经离开了,但我刚刚陷入困境我相信我也错误地执行了add()
功能,所以如果有人能提供一些见解,我将非常感激。
代码:
#include <iostream>
#include <string>
using namespace std;
//------------------------------------------------------------
class Animal
{
private:
string name;
string sound;
public:
Animal(const string& n = "", const string& s = "");
~ Animal();
string getName() const {return name;}
string makeSound() const{return sound;}
};
Animal::Animal(const string&n, const string &s)
{
name=n;
sound=s;
}
Animal:: ~ Animal() //Destructor
{
}
ostream &operator <<(ostream& out, Animal & obj)
{
cout <<obj.getName()<<" says "<<obj.makeSound() ;
return out;
}
//------------------------------------------------------------
class Exhibit{
public:
Exhibit(int maxEnt = 10);
~Exhibit();
void add(const Animal& e);
Animal& operator [](size_t i){ return entries[i];};
friend ostream& operator <<(ostream& out, const Exhibit& obj);
private:
int MaxNumberOfAnimals;
int CurrentNumberOfAnimals;
Animal* entries;
};
Exhibit::Exhibit(int maxEnt)
{
MaxNumberOfAnimals=maxEnt;
}
Exhibit:: ~ Exhibit()
{
}
void add(const Animal& e)
{
int j=0;
entries[j]=e;
j++;
return;
}
ostream& operator <<(ostream& out, const Exhibit& obj)
{
cout <<"{ ";
for(int i=0;i++;i!=obj.MaxNumberOfAnimals)
{
cout << obj.entries[i] << ", ";
}
cout << "}"<<endl;
return out;
}
//------------------------------------------------------------
int main()
{
Animal* monkey = new Animal("Max", "Eeeeep");
Animal* tiger = new Animal("Jack", "Roar");
Animal* Dog = new Animal("Petals", "Woof");
cout << *monkey <<endl;
cout << *tiger <<endl;
cout << *Dog << endl;
Exhibit cage(10);
cage.add(*monkey);
cage.add(*tiger);
/*cage.add(Animal("Batty", "Screech"));
cage.add(Animal("Sheepy", "Bleat Bleat"));
cage.add(Animal("Hippopotamusesy", "growl"));
cage.add(Animal("Turkey","Gobble"));*/
cout << cage << endl;
cout << cage << endl;
delete monkey;
delete tiger;
delete Dog;
system("pause");
return 0;
}
//------------------------------------------------------------
答案 0 :(得分:1)
entries[j] = e;
- 那里有未定义的行为,因为entries
是未初始化的指针(由垃圾数据产生)并且您正在尝试访问指向的内存位置用那个无效的指针。
如果您可以使用std::vector
,请使用它。否则,您的Exhibit
类需要部分实现一个 - 分配,重新分配,重新分配,深层复制,如果您想要可复制Exhibit
...
答案 1 :(得分:1)
可能导致您的&lt;&lt;&lt;&lt;&lt;重载是你发送所有内容到cout,而不是你传入的流出。可能的修复可能会将“cout”更改为“out”,如下所示:
ostream &operator <<(ostream& out, Animal & obj)
{
out <<obj.getName()<<" says "<<obj.makeSound() ;
return out;
}
至于您在Exhibit类中的添加功能,看起来每次调用该函数时都会初始化计数器'j',这意味着它总是为0.您可以通过使计数器成为私有来解决此问题Exhibit类的数据成员,或者只是通过使用'int CurrentNumberOfAnimals'来跟踪,如下所示:
void add(const Animal& e)
{
entries[CurrentNumberOfAnimals]=e;
CurrentNumberOfAnimals++;
return;
}
我可能还有其他错误没有注意到,但也有一些错误。
编辑: 如上面的答案中所述,条目未正确初始化。如果可以,请使用动物矢量,如下所示:
#include <vector> //This should be in your Exhibit header file
class Exhibit{
public:
Exhibit(int maxEnt = 10);
~Exhibit();
void add(const Animal& e);
Animal& operator [](size_t i){ return entries[i];};
friend ostream& operator <<(ostream& out, const Exhibit& obj);
private:
int MaxNumberOfAnimals;
int CurrentNumberOfAnimals;
vector<Animal> entries;
};
这也简化了你的添加功能,但见下文:
void add(const Animal& e)
{
entries.push_back(e);
return;
}
第二编辑: 据我所知,这是使用数组的方法。假设您的“条目”数组中最多需要10只动物,因为您的原始图表类中有“int maxent = 10”。
您的Exhibit类声明可能如下所示(我们不应再在构造函数中使用“int maxent”,除非您出于其他原因需要它):
class Exhibit{
public:
Exhibit();
~Exhibit();
void add(const Animal& e);
Animal& operator [](size_t i){ return entries[i];};
friend ostream& operator <<(ostream& out, const Exhibit& obj);
private:
int MaxNumberOfAnimals;
int CurrentNumberOfAnimals;
Animal entries[10];
};
您的添加功能可能看起来像上面的第一个添加功能,为方便起见,在这里重新编写:
void add(const Animal& e)
{
entries[CurrentNumberOfAnimals]=e;
CurrentNumberOfAnimals++;
return;
}