重载<<<运算符和添加函数的问题

时间:2015-08-11 21:19:27

标签: c++ overloading

所以我最近又重新开始编程,为我去年的物理学做准备,我遇到了一些例子。

它说我需要添加代码中显示的特定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;
}
//------------------------------------------------------------

2 个答案:

答案 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;
}