首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用主文件中的类初始化函数的方法是什么?

用主文件中的类初始化函数的方法是什么?
EN

Stack Overflow用户
提问于 2021-11-25 03:35:07
回答 3查看 54关注 0票数 1

这个程序是一个c++项目,使用谷仓和动物的类创建一个动物谷仓。这些动物是通过它们的名字、类型和体重来识别的。在特定的时间,动物会进食并增加体重。用户可以选择要经过的天数。大部分代码已经写好了,现在是让main来处理类函数的问题了。当我尝试在main中执行函数时,我得到了错误代码"main.cpp:117:28: error:‘class Animal’没有名为‘display’的成员“,这一行声明: cout << barni->display()这里是代码。

代码语言:javascript
复制
// 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";
                    }
                }
            }
        }
    }
}
EN

回答 3

Stack Overflow用户

发布于 2021-11-25 04:09:45

下面是operator <<重载的方式,而不是编写一个完全独立的函数:

代码语言:javascript
复制
#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;
}
票数 1
EN

Stack Overflow用户

发布于 2021-11-25 08:35:54

在类Animal中,您可以只实现返回字符串的display()方法,更改后一切都会正常工作:

代码语言:javascript
复制
std::string display() const {
    std::stringstream ss;
    ss << "type: " << type << ", name: " << name
        << ", weights: " << weight << std::endl;
    return ss.str();
}

下面是完全更正的代码。我还必须修复一些拼写错误,以使代码可编译:

Try it online!

代码语言:javascript
复制
// 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();
                }
            }
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2021-11-26 04:19:40

好的,这就是我是如何让它工作的。谢谢你的帮助,真的帮了我大忙。

代码语言:javascript
复制
//Fixed Practice code

#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <vector>

using namespace std;

// 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)
    Animal(string type, string name, int weight) {
        //Added code to called the setters
        setWeight(weight);
        setName(name);
        setType(type);
    }

    // getters
    string getType() { return type; }
    string getName() { return name; }
    int getWeight() { return weight; }

    //Added setter for type
    void setType(string type) { this->type = type; }
    //Added setter for name
    void setName(string name) { this->name = name; }
    // setter for weight
    void setWeight(int weight) { this->weight = weight; }

    //Added the display method in the Animal class to display the animal details
    string display() {
        string printLine = "";
        printLine = "\nAnimal Type: " + this->getType() + ", Animal Name: " + this->getName() + ", Animal Weight: " + to_string(this->getWeight());
        return printLine;
    }
};

// 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();
    void display();

};

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);
    }

}

//Added the display code here, moved the code from inside the Barn constructor
void Barn::display() {
    for (int i = 0; i < barn.size(); i++) {
        cout << barn[i]->display() << " " << " "; //This Displays all the animals
    }
}

void Barn::feedAnimal() {
    int days;// = 0;
    string feed;
    cout << "\nhow many days:";
    cin >> days;
    //Added the code here - Sort of modifications
    //We are looping the vector once, check the time and animal increase the weight, the prior code was looping the vector multiple times for a day and time
    for (int day = 0; day < days;day++) {
        for (int feedtime = 1; feedtime <= 12; feedtime++) {
            feed = to_string(feedtime) + ":00"; // define the type for feed
            cout << "\nThe Time is " << feed << "\n";
            for (int barnNum = 0; barnNum < barn.size();barnNum++) {
                if ((feedtime == 3) && (barn[barnNum]->getType() == "chicken")) {
                    barn[barnNum]->setWeight(barn[barnNum]->getWeight() + 1); // add 1 pound to its weight
                    cout << "\n" << barn[barnNum]->getName() << " " << barn[barnNum]->getType() << " now weighs " << barn[barnNum]->getWeight() << " lbs";
                }

                if ((feedtime == 5) && (barn[barnNum]->getType() == "horse")) {
                    barn[barnNum]->setWeight(barn[barnNum]->getWeight() + 5); // add 5 pound to its weight
                    cout << "\n" << barn[barnNum]->getName() << " " << barn[barnNum]->getType() << " now weighs " << barn[barnNum]->getWeight() << " lbs";
                }

                if ((feedtime == 7) && (barn[barnNum]->getType() == "cow")) {
                    barn[barnNum]->setWeight(barn[barnNum]->getWeight() + 5); // add 5 pound to its weight
                    cout << "\n" << barn[barnNum]->getName() << " " << barn[barnNum]->getType() << " now weighs " << barn[barnNum]->getWeight() << " lbs";
                }
            }
        }
    }
}

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;
    //Added code to create a Barn object
    Barn myBarn;
    cout << "Choose an option: \n";
    cout << "Enter 1, 2 or 3: ";
    cin >> choice;
    switch (choice)
    {
    case 1:
        cout << "\nChoice 1"; //Here we will run feedAnimal
        //Call the feedAnimal() method
        myBarn.feedAnimal();
        break;
    case 2:
        cout << "\nChoice 2";
        //Call the display() method
        myBarn.display();
        break;//Here we will display all the animals
    case 3:
        cout << "\nChoice 3"; break;//Here we will exit the program
    default:
        cout << "\nNot 1, 2 or 3"; break;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70105503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档