// petcount.cpp - Script 9.1

#include <iostream>

#include <string>

// Declare the class.
class Pet {
             // Constructor and destructor.
             Pet(std::string theName);
             void eat();
             void sleep();
             // Static method that will
             // return the current value of count:
             static int getCount();
             std::string name;
             // count will store the number of pets.
             static int count;
             // Declare the inherited classes.
             class Cat : public Pet {
             Cat(std::string theName);
             void climb();
             class Dog : public Pet {
             Dog(std::string theName);
             void bark();
             // Allocate space for the static variable.
             int Pet::count = 0;
             // Define the methods.
             Pet::Pet(std::string theName) {
             name = theName;
             // A new pet is being created so increment the counter.
             std::cout << "Creating a pet named '" << name << "'\n";
             Pet::~Pet() {
             // The destructor is called when the object ceases to exist
             // therefore, decrement the counter.
             std::cout << "Deleting the pet named '" << name << "'\n";
             void Pet::sleep() {
             std::cout << name << " sleeps\n";
             void Pet::eat() {
             std::cout << name << " eats\n";
             class Cat : public Pet {
             Cat::Cat(std::string theName) : Pet(theName) { 
             void Cat::climb() {
             std::cout << name << " climbs a tree\n";
             Dog::Dog(std::string theName) : Pet(theName) {
             void Dog::bark() {
             std::cout << name << " goes 'woof- woof'\n";
             int main() {
             // Create two objects.
             Cat cat("Garfield");
             Dog dog("Odie");
             // Print the current pet count.
             std::cout << "You own " << Pet::getCount() << " pets\n";
             // Create another object
             // Within a seperate code block.
             Cat anotherCat("Geraldine");
             std::cout << "Now, you own " << anotherCat.getCount() << " pets\n";
             // anotherCat goes out of scope.
             // The compiler will call anotherCat's destructor.
             // Repeat the count.
             std::cout << "And you're back to " << Pet::getCount() << " pets\n";
             std::cout << "Press Enter or Return to continue. ";
             return 0;

I don't understand why the program isn't compileing? I get this when I try to compile and run the program:
line file message
71 C:\Dev-Cpp\petcount.cpp redefinition of `class Cat'

Can anyone help me understand why it's not compileing or fix this program? Many thanks in advance!

Edited 5 Years Ago by jimmymack: n/a

I'm now getting this error:
[Linker error] undefined reference to `Pet::getCount()'

I think it's because this is missing out of the program:
int Pet::getCount() { return count; }

Am I right? My book mentions the above code but doesn't include it in the main example code that Iv'e posted. If so any suggestions where I should insert Int Pet::getCount() { return count; }? Many thanks again!!

I worked it out. I inserted Int Pet::getCount() { return count; } in line 70 and got it working.

I'm having another problem though with calling the destructors for "Garfield" and "Odie" After I press Enter in:
std::cout << "Press Enter or Return to continue. "; the destructors are called in the example in my book but it's not happening for me.

Is there a way to adapt the program so that all the objects destructors are called? Many thanks again!!

This article has been dead for over six months. Start a new discussion instead.