使用C ++帮助进行面向对象的编程

时间:2011-02-19 08:03:22

标签: c++ arrays oop object

如果有可能,我需要一些帮助来解决这个问题。我还是很新,所以请原谅我。我有一个对象数组,我想要一个方法来操纵我。我不确定如何最好地用文字说这些,所以我将用一个例子。

#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数组中两个索引的数量。我该怎么做呢如果这看起来很蠢,我很抱歉。

6 个答案:

答案 0 :(得分:3)

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

一个可能合理的课程设计应该是这样的:

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!

答案 1 :(得分:1)

我担心这里存在很多概念错误。

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

当你说

 fruit apples[2];

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

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

现在的问题是代码应该放在哪里?这是OO编程理念的基础,您可以考虑哪些对象可以合理地“理解”这种操作,负责照看水果。因此你可能会有一个篮子课,或者其他一些课程。

现在进入下一个对象

fruit pie;
pie.eat();

这里有些问题,首先馅饼肯定不是结果。考虑水果可以做的所有事情,以及馅饼可以做的所有事情,它们是非常不同的 - 好吧,你可以把它们切成两半,然后吃它们,但它们并不比任何其他食物更相似。当你创建类时,你会寻找关键的相似之处:苹果,橘子,也许它们有相似之处,所以Fruit作为一个类是有道理的。

第二个问题,我认为你期望pie.eat()对苹果数组产生一些影响。但这些是完全不同的对象。同一类的两个对象通常不会相互了解(有一些先进的技术可以实现这一点,但现在甚至都没有想到这一点。)

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

目前尚不清楚您正在建模的动作类型。如果您要跟踪您的水果库存,那么您可能会有一个篮子类。使用诸如

之类的方法
addFruit( arrayOfFruit);
takeFruit( what kind of fruit I want);
howManyFruit(kind of fruit);

如果您正在模拟卡路里消耗,那么您可能在Fruit上有方法

calories = takeOneBite();

biteLeft = howManyBitesLeft();

因此,在我们进一步提供帮助之前,我们需要了解您真正想要的水果。

答案 2 :(得分:0)

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

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

我会等! :)

答案 3 :(得分:0)

您需要将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)
}

答案 4 :(得分:0)

由于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。另请注意,这是您所提出的问题,但设计很糟糕。

答案 5 :(得分:0)

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

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