【问题标题】:Help with Object Oriented Programming with C++使用 C++ 进行面向对象编程的帮助
【发布时间】:2011-02-19 08:03:21
【问题描述】:

如果可能的话,我需要一些帮助来解决这个问题。我对此还是很陌生,所以请原谅我。我有一个对象数组,我想要一个方法来为我操作。我不确定如何最好地用文字表达,所以我将举一个例子。

#include <iostream>

using namespace std;

class fruit
{
    private:
        int amount;
    public:
        void eat();
};
void fruit::eat()
{
    //manipulate the amount for apples at both indexes here
}

int main()
{
    fruit apples[2];
    fruit pie;

    pie.eat();

return 0;
}

我想使用eat() 函数更改apples 数组中两个索引处的数量。我将如何去做这件事。如果这看起来很愚蠢,我很抱歉。

【问题讨论】:

  • 首先,如果你完成了你的家庭作业,毫无疑问是愚蠢的。其次我还是不清楚你想要什么?

标签: c++ arrays oop object


【解决方案1】:

实际上,您的问题以及许多答案似乎都不正确,因为吃水果没有意义。 “水果吃水果”是什么意思?你能解释一下吗?

一个可能且合理的类设计应该是这样的:

class person
{
  public: 
    void eat(edible *item) {}
    void drink(drinkable *item) {}
    void sleep(double duration) {}
    //...
};    
class edible
{
  public:
     virtual ~edible() {}
     virtual double get_calories() = 0; //pure virtual function
     //...
}
class fruit : public edible
{
  public:
     virtual double get_sweetness() = 0; //pure virtual function
     //...
}
class apple : public fruit 
{
  public:
     //define pure virtual functions
}
class banana : public fruit 
{
  public:
     //define pure virtual functions
}

std::vector<edible*> items;
items.push_back(new apple());
items.push_back(new apple());
items.push_back(new banana());
items.push_back(new banana());

person nawaz;

for(int i = 0 ; i < items.size() ; i++ )
   nawaz.eat(items[i]);

nawaz.sleep(8 * 60 * 60); //8 hours!

【讨论】:

  • 你忘了指定你要睡多久 :)
  • @Andy:对不起,我在睡觉,所以看不到评论。现在是早上 6 点 27 分。不管怎样,我要再睡8个小时。 :D
【解决方案2】:

恐怕这里有不少概念性错误。

解决您的直接问题:您的水果类无法理解它所在的“篮子”,因此要求它在篮子上工作是不合理的。

当你说

 fruit apples[2];

您正在制作两个苹果对象,每个对象都有一个 eat() 方法(我稍后会回到那个,因为我不确定这是否有意义),然后将它们放入一个数组中。数组本身(我之前将其称为篮子)包含苹果,但没有任何 eat() 方法。苹果不知道它们在数组中。所以为了吃苹果,你需要一些代码来遍历数组(原谅这个语法,我写 c++ 已经好几年了)

 for ( int i = 0; i < 2; i ++ ){
     apples[i].eat();
 }

现在的问题是该代码应该放在哪里?这是面向对象编程思想的基础,你想想什么对象可以合理地“理解”这种操作,有责任照顾水果。因此你可能有一个 Basket 类,或类似的。

现在到下一个对象

fruit pie;
pie.eat();

这里有些问题,首先馅饼肯定不是水果。考虑一下水果可以做的所有事情,和馅饼可以做的所有事情,它们是非常不同的——好吧,你可以把它们都切成薄片,然后一起吃,但它们并不比任何其他食物都相似。当您创建类时,您会寻找关键的相似之处:Apples、Oranges,是的,它们可能具有有用的相似之处,因此 Fruit 作为一个类是有意义的。

第二个问题,我认为您期望 pie.eat() 对苹果数组产生一些影响。但这些是完全不同的对象。同一类的两个对象通常并不完全了解对方(有一些先进的技术可以做到这一点,但现在甚至不要考虑这个)。

现在进入最后一个我认为最关键的一点:eat() 方法。在我的世界里,苹果不吃东西,也不吃自己。在做 OO 时,很大程度上是在为现实世界建模。当你得到这样的东西时,一个与所讨论的对象并不真正对应的方法可能意味着还有另一类我们尚未识别的对象。

目前尚不清楚您正在建模什么样的动作。如果您正在跟踪您的水果库存,那么您可能有一个 Basket 类。使用方法如

addFruit( arrayOfFruit);
takeFruit( what kind of fruit I want);
howManyFruit(kind of fruit);

如果您正在模拟卡路里消耗,您可能有关于 Fruit 的方法

calories = takeOneBite();

biteLeft = howManyBitesLeft();

因此,我们需要了解您真正想对水果做什么,然后才能提供进一步帮助。

【讨论】:

    【解决方案3】:

    首先,不需要请求原谅,像 stackoverflow 这样的网站存在,所以问题得到了解答。如果有人对你有过“聪明”的态度,那是他们的问题,而不是你的问题。

    现在,对于您的问题:在您的 eat() 方法中,您有一条注释说明您想要操纵苹果的数量。但是该方法属于整个水果类,所以您真正想要的是操纵任何给定水果的数量,对吧?此外,目前还不是很清楚你到底想要操纵什么,所以如果你能提供一个更好的解释,我想你会得到更多的答案。

    我会等的! :)

    【讨论】:

      【解决方案4】:

      您需要将apples 数组传递给eat 函数。像这样的:

      void fruit::eat(fruit* apples, unsigned int count)
      {
       for(unsigned int apple = 0; apple < count; ++apple)
       {
         apples[apple].amount = 0;
       }
      }
      

      在main()中

      { 
         pie.eat(apples,2)
      }
      

      【讨论】:

        【解决方案5】:

        你不能,不能来自类方法(函数)。一种方法始终适用于一个实例,例如您的fruit pie。苹果数组是两个实例,因此您只需在每个实例上调用eat()

        fruit apples[2];
        apples[0].eat();
        apples[1].eat();
        

        【讨论】:

          【解决方案6】:

          由于pie对象需要修改apples,实现的一种方式是重载fruit::eat()以获取fruit*类型的参数。

          #include <iostream>
          
          using namespace std;
          
          class fruit
          {
              private:
                  int amount;
              public:
                  void eat(fruit *obj);
                  void eat(){};
          };
          void fruit::eat(fruit *obj)
          {
             obj[0].amount = 10; // Modify here to what ever value you need
             obj[1].amount = 20;
          }
          
          int main()
          {
              fruit apples[2];
              fruit pie;
          
              pie.eat(apples);
          
              return 0;
          }
          

          结果ideone。另请注意,这是在做您所问的问题,但设计很糟糕。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-03-13
            • 1970-01-01
            • 2010-12-13
            • 2015-02-12
            • 2011-04-16
            • 2014-11-23
            • 2011-06-11
            相关资源
            最近更新 更多