【问题标题】:What is the way to initialize a function with classes in the main file?用主文件中的类初始化函数的方法是什么?
【发布时间】:2022-01-03 09:34:33
【问题描述】:

这个程序是一个 c++ 项目,使用谷仓和动物的类来创建一个动物谷仓。这些动物通过它们的名字、类型和重量来识别。在特定时间,动物会进食并增加体重。用户可以选择要经过多少天。大部分代码都已经写好了,现在是让 main 使用类函数的问题了。当我尝试在 main 中执行功能时,我收到错误代码“main.cpp:117:28: error: 'class Animal' has no member named 'display'” 相对于以下行:cout 显示() 这是代码。

// 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";
                    }
                }
            }
        }
    }
}

【问题讨论】:

  • 错误信息没有说谎。 class Animal中没有这个功能。另一个问题是你在 main 函数之后声明了所有这些类,所以如果你尝试在 main 中使用它们,那么你会因为编译器从未见过它们而出错。花一些时间正确缩进你的代码是值得的。在写的时候这样做。正如目前所写的,它基本上是不可读的。
  • 考虑重载operator&lt;&lt;(),而不是display函数。

标签: c++ pointers vector main cout


【解决方案1】:

好的,这就是我的工作方式。感谢大家的帮助,真的帮了我大忙。

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

【讨论】:

    【解决方案2】:

    Animal 类中,您只需实现返回字符串的display() 方法,更改后一切正常:

    std::string display() const {
        std::stringstream ss;
        ss << "type: " << type << ", name: " << name
            << ", weights: " << weight << std::endl;
        return ss.str();
    }
    

    下面的完整更正代码。还必须修正一些错别字以使代码可编译:

    Try it online!

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

    【讨论】:

      【解决方案3】:

      不是编写一个完全独立的函数,而是操作符

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

      【讨论】:

        猜你喜欢
        • 2021-09-04
        • 1970-01-01
        • 2020-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-27
        相关资源
        最近更新 更多