Помощь с объектно-ориентированным программированием на C ++ - PullRequest
0 голосов
/ 19 февраля 2011

Мне нужна помощь, чтобы выяснить это, если это возможно.Я все еще новичок в этом, поэтому, пожалуйста, прости меня.У меня есть массив объектов, которым я хочу, чтобы метод управлял для меня.Я не уверен, как лучше всего выразить это словами, поэтому я буду использовать пример.

#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 ().Как бы я поступил так?Извините, если это кажется глупым.

Ответы [ 6 ]

3 голосов
/ 19 февраля 2011

Ну, на самом деле ваш вопрос, а также многие ответы не кажутся правильными, , потому что нет смысла есть фрукты Что значит "фрукты едят фрукты"?Не могли бы вы объяснить?

Возможный и разумный дизайн класса должен сделать что-то вроде этого:

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 голос
/ 19 февраля 2011

Я боюсь, что здесь есть довольно много концептуальных ошибок.

Чтобы ответить на ваш непосредственный вопрос: ваш фруктовый класс не может понять «корзину», в которой он находится, поэтому не стоит спрашиватьэто работает в корзине.

Когда вы говорите

 fruit apples[2];

, вы создаете два яблочных объекта, каждый из которых имеет метод eat () (я вернусь к этому вмгновение, потому что я не уверен, что это имеет смысл), а затем поместить их в массив.В самом массиве (я раньше называл его корзиной) содержатся яблоки, но у него нет метода eat ().Яблоки не знают, что они в массиве.Итак, чтобы съесть яблоки, вам нужен код для обхода массива (простите этот синтаксис, прошло много лет с тех пор, как я написал c ++)

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

Теперь вопрос в том, куда этот код должен идти?И это имеет основополагающее значение для идеи ОО-программирования: вы думаете о том, какие объекты могли бы разумно «понять» этот вид операций, иметь обязанности по уходу за фруктами.И поэтому у вас может быть класс Basket или что-то подобное.

Теперь перейдем к следующему объекту

fruit pie;
pie.eat();

Некоторые проблемы здесь, в первую очередь пирог, безусловно, не фрукт.Рассмотрите все, что может сделать фрукт, и все, что может сделать пирог, они очень разные - хорошо, вы можете нарезать их обоих и съесть их обоих, но они не более похожи, чем любая другая еда.Когда вы создаете классы, вы ищете ключевые сходства: у яблок, апельсинов, да, возможно, они имеют полезное сходство, поэтому Fruit как класс имеет смысл.

Вторая проблема, я думаю, вы ожидаете, что pie.eat ()оказать некоторое влияние на массив яблок.Но это совершенно разные объекты.Два объекта одного и того же класса обычно не знают друг о друге (есть некоторые продвинутые методы, позволяющие сделать это возможным, но даже не думайте об этом сейчас).

Теперь о финале, и я думаю, что наиболее важный момент: есть () метод.В моем мире яблоки ничего не едят и не едят сами.При выполнении ОО в значительной степени вы моделируете реальный мир.Когда вы получаете что-то вроде этого, метод, который на самом деле не соответствует рассматриваемым объектам, это, вероятно, подразумевает, что есть еще один класс объектов, которые мы еще не определили.

Не ясно, какие действияты моделируешь.Если вы отслеживаете свой инвентарь фруктов, то у вас может быть класс Basket.С помощью таких методов, как

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

Если вы моделируете потребление калорий, у вас могут быть методы для фруктов

calories = takeOneBite();

biteLeft = howManyBitesLeft();

Поэтому нам нужно понять, что вы действительно хотите сделать с фруктами, прежде чем мыможет помочь в дальнейшем.

0 голосов
/ 19 февраля 2011

Вы не можете, не из метода класса (функции). Метод всегда работает для одного экземпляра, например, fruit pie. Массивы яблок - это два экземпляра, поэтому вы просто вызываете eat() для каждого из них:

fruit apples[2];
apples[0].eat();
apples[1].eat();
0 голосов
/ 19 февраля 2011

Поскольку объекту 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 . Также обратите внимание, что это делает то, что вы задали в вопросе, но дизайн плохой.

0 голосов
/ 19 февраля 2011

Вам необходимо передать массив 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)
}
0 голосов
/ 19 февраля 2011

Прежде всего, не нужно просить прощения, такие сайты, как stackoverflow, существуют, поэтому на вопросы можно получить ответы.Если кто-то когда-либо относится к вам с "умной задницей", это его проблема, а не ваша.

Теперь к вашему вопросу: в вашем методе eat () есть комментарий о том, что вы хотите манипулироватьсумма для яблок.Но этот метод относится ко всему классу фруктов, так что вы действительно хотите манипулировать количеством для любого данного фрукта, верно?Кроме того, не очень ясно, чем именно вы хотите манипулировать, поэтому, если бы вы могли дать лучшее объяснение, я думаю, вы получите гораздо больше ответов.

Я буду ждать!:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...