This program is a c project to create a barn of animal using classes for the barn and animals. The animals are identified by their name, type, and weight. At a specified time, the animals will eat and gain weight. The user has the option to choose how many day periods will pass. Most of the code has been written, now it is a matter of getting main to work with the class functions. When I try to do functions in main, I get the error code "main.cpp:117:28: error: ‘class Animal’ has no member named ‘display’" with respect to the line that states: cout << barn[i]->display() Here is the code.
// C program to create classes for Barn of Animals
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <vector>
using namespace std;
int main()
{
//I need to run the program so a unit of time passes
//When the time runs, the time will be compared to
//the animals feeding time. When that feed time passes,
//The animal gains weight and the new weight is shown.
int choice;
cout << "1) Simulate Days" << endl;
cout << "2) Display Animals" << endl;
cout << "3) Exit" << endl;
cout << "Choose an option: \n";
cout << "Enter 1, 2 or 3: ";
cin >> choice;
switch (choice)
{
case 1:
cout << "Choice 1";
break; //Here we will run feedAnimal
case 2:
cout << "Choice 2";
break; //Here we will display all the animals
case 3:
cout << "Choice 3";
break; //Here we will exit the program
default:
cout << "Not 1, 2 or 3";
break;
}
}
// base Animal class
class Animal
{
private:
// data members
string type;
string name;
int weight;
public:
// constructor to initialize the members to specified values
Animal(string type, string name, int weight): type(type), name(name), weight(weight) {}
// getters
string getType()
{
return type;
}
string getName()
{
return name;
}
int getWeight()
{
return weight;
}
// setter for weight
void setWeight(int weight)
{
this->weight = weight;
}
};
// derived class Horse
class Horse: public Animal
{
public: Horse(string name, int weight): Animal("horse", name, weight) {}
};
// derived class Cow
class Cow: public Animal
{
public: Cow(string name, int weight): Animal("cow", name, weight) {}
};
// derived class Chicken
class Chicken: public Animal
{
public: Chicken(string name, int weight): Animal("chicken", name, weight) {}
};
class Barn
{
private:
vector<Animal*> barn;
public:
Barn();
void feedAnimal();
};
Barn::Barn()
{
srand(time(0)); // this will be srand not rand
Animal * a;
for (int i = 0; i < 5; i )
{
a = new Horse("Artax" to_string(i 1), rand() % 200 1820); // end with semicolon not colon
barn.push_back(a);
a = new Cow("Fafnir" to_string(i 1), rand() % 250 1200); // convert (i 1) to string not (i )
barn.push_back(a);
a = new Chicken("David" to_string(i 1), rand() % 2 15);
barn.push_back(a);
for (int i = 0; i < barn.size(); i )
{
cout << barn[i]->display() << " " << " "; //This Displays all the animals
}
}
void Barn::feedAnimal()
{
int days; // = 0;
cout << "how many days:";
cin >> days;
for (int day = 0; day < days; day )
{
for (int i = 1; i <= 12; i )
{
string feed = to_string(i) ":00"; // define the type for feed
cout << "The Time is " << feed << "\n";
if (i == 3) // time is 3:00, feed the chickens
{
// loop over the vector of Animals to feed the Chicken
for (size_t i = 0; i < barn.size(); i )
{
if (barn[i]->getType() == "chicken") // this animal is chicken
barn[i]->setWeight(barn[i]->getWeight() 1); // add 1 pound to its weight
cout << name << " " << type << " now weighs " << getweight() << " lbs";
}
}
else if (i == 5) // time is 5:00, feed the horses
{
// loop over the vector of Animals to feed the Horse
for (size_t i = 0; i < barn.size(); i )
{
if (barn[i]->getType() == "horse") // this animal is horse
barn[i]->setWeight(barn[i]->getWeight() 5); // add 5 pound to its weight
cout << name << " " << type << " now weighs " << getweight() << " lbs";
}
}
else if (i == 7) // time is 7:00, feed the cows
{
// loop over the vector of Animals to feed the Cow
for (size_t i = 0; i < barn.size(); i )
{
if (barn[i]->getType() == "cow") // this animal is cow
barn[i]->setWeight(barn[i]->getWeight() 5); // add 5 pound to its weight
cout << name << " " << type << " now weighs " << getweight() << " lbs";
}
}
}
}
}
}
CodePudding user response:
Instead of writing a completely separate function, this is how operator << can be overloaded:
#include <iostream>
class MyClass {
int i = 0;
public:
MyClass() : i(4) { }
friend std::ostream& operator<<(std::ostream& out, MyClass obj) {
out << obj.i;
return out;
}
};
int main() {
MyClass myClass;
std::cout << myClass;
return 0;
}
CodePudding user response:
Inside class Animal
you can just implement display()
method that returns string and everything works after that change:
std::string display() const {
std::stringstream ss;
ss << "type: " << type << ", name: " << name
<< ", weights: " << weight << std::endl;
return ss.str();
}
Full corrected code below. Also had to fix some typos to make code compilable:
// C program to create classes for Barn of Animals
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <sstream>
using namespace std;
int main()
{
//I need to run the program so a unit of time passes
//When the time runs, the time will be compared to
//the animals feeding time. When that feed time passes,
//The animal gains weight and the new weight is shown.
int choice;
cout << "1) Simulate Days" << endl;
cout << "2) Display Animals" << endl;
cout << "3) Exit" << endl;
cout << "Choose an option: \n";
cout << "Enter 1, 2 or 3: ";
cin >> choice;
switch (choice)
{
case 1:
cout << "Choice 1";
break; //Here we will run feedAnimal
case 2:
cout << "Choice 2";
break; //Here we will display all the animals
case 3:
cout << "Choice 3";
break; //Here we will exit the program
default:
cout << "Not 1, 2 or 3";
break;
}
}
// base Animal class
class Animal {
private:
// data members
string type;
string name;
int weight;
public:
// constructor to initialize the members to specified values
Animal(string type, string name, int weight): type(type), name(name), weight(weight) {}
// getters
string getType()
{
return type;
}
string getName()
{
return name;
}
int getWeight()
{
return weight;
}
// setter for weight
void setWeight(int weight)
{
this->weight = weight;
}
std::string display() const {
std::stringstream ss;
ss << "type: " << type << ", name: " << name
<< ", weights: " << weight << std::endl;
return ss.str();
}
};
// derived class Horse
class Horse: public Animal
{
public: Horse(string name, int weight): Animal("horse", name, weight) {}
};
// derived class Cow
class Cow: public Animal
{
public: Cow(string name, int weight): Animal("cow", name, weight) {}
};
// derived class Chicken
class Chicken: public Animal
{
public: Chicken(string name, int weight): Animal("chicken", name, weight) {}
};
class Barn
{
private:
vector<Animal*> barn;
public:
Barn();
void feedAnimal();
};
Barn::Barn() {
srand(time(0)); // this will be srand not rand
Animal * a;
for (int i = 0; i < 5; i )
{
a = new Horse("Artax" to_string(i 1), rand() % 200 1820); // end with semicolon not colon
barn.push_back(a);
a = new Cow("Fafnir" to_string(i 1), rand() % 250 1200); // convert (i 1) to string not (i )
barn.push_back(a);
a = new Chicken("David" to_string(i 1), rand() % 2 15);
barn.push_back(a);
for (int i = 0; i < barn.size(); i )
{
cout << barn[i]->display() << " " << " "; //This Displays all the animals
}
}
}
void Barn::feedAnimal()
{
int days; // = 0;
cout << "how many days:";
cin >> days;
for (int day = 0; day < days; day )
{
for (int i = 1; i <= 12; i )
{
string feed = to_string(i) ":00"; // define the type for feed
cout << "The Time is " << feed << "\n";
if (i == 3) // time is 3:00, feed the chickens
{
// loop over the vector of Animals to feed the Chicken
for (size_t i = 0; i < barn.size(); i )
{
if (barn[i]->getType() == "chicken") // this animal is chicken
barn[i]->setWeight(barn[i]->getWeight() 1); // add 1 pound to its weight
//cout << name << " " << type << " now weighs " << getWeight() << " lbs";
cout << barn[i]->display();
}
}
else if (i == 5) // time is 5:00, feed the horses
{
// loop over the vector of Animals to feed the Horse
for (size_t i = 0; i < barn.size(); i )
{
if (barn[i]->getType() == "horse") // this animal is horse
barn[i]->setWeight(barn[i]->getWeight() 5); // add 5 pound to its weight
//cout << name << " " << type << " now weighs " << getWeight() << " lbs";
cout << barn[i]->display();
}
}
else if (i == 7) // time is 7:00, feed the cows
{
// loop over the vector of Animals to feed the Cow
for (size_t i = 0; i < barn.size(); i )
{
if (barn[i]->getType() == "cow") // this animal is cow
barn[i]->setWeight(barn[i]->getWeight() 5); // add 5 pound to its weight
//cout << name << " " << type << " now weighs " << getWeight() << " lbs";
cout << barn[i]->display();
}
}
}
}
}