Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.08.2011, 23:51   #1
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию [Вопрос С++: Наследование] Создание пустых классов.

Вопрос такой. В общем понадобилась вот такая конструкция:

Код:
...

class Man
{
   ...
};

class Player : public Man
{
   int health;
...
public:
   int get_health(){return health;}
   int change_health(int dam){ health -= dam; return health;}
...
};

class Enemy : public Man
{
   int health;
...
public:
   int get_health(){return health;}
   int change_health(int dam){ health -= dam; return health;}
...
};
...

Man *pl, *en;
pl = new Player;
en = new Enemy;

int strike(Man* M,int damage)
{
  ...
   M->change_health(damage);
  ...
   return M->get_health();
}
Дык вот вопрос: Это всё будет работать?
Или необходимо описать get_health() и change_health() как virtual? А потом переопределять их в потомках?
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 12.08.2011, 00:00   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

работать не будет, да и самому разве не очевидно, что health (и всё, что с ним связано) надо поместить в class Man, тогда и Player и Enemy его унаследуют, и дублирование пропадёт.
А virtual понадобится только тогда, когда появится некоторый объект, у которго change_health() будет работать по-другому.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 12.08.2011, 00:17   #3
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Т.е. health и пр. перенести в секцию public класса man и наследовать?

P.S.

А если мне необходимо будет обращатся к методам, которые не являются методами класса Man?
Тогда надо будет определить класс Man как абстрактный и добавить в него чисто виртуальных методов?

P.P.S.

А если я создам 2 чисто виртуальных метода get_bullets() и get_knifes(). Причем get_bullets() - будет использоваться в классе Player,но не будет использоваться в классе Enemy, а get_knifes() с точностью да наоборот? Что делать с "ненужными генами" ?
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.

Последний раз редактировалось MooNDeaR; 12.08.2011 в 00:34.
MooNDeaR вне форума Ответить с цитированием
Старый 12.08.2011, 00:45   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

health в private, а get_health/change_health в public. Man должен содержать в себе всё общее, что имеют между собой классы Player и Enemy.
Цитата:
А если я создам 2 чисто виртуальных метода get_bullets() и get_knifes(). Причем get_bullets() - будет использоваться в классе Player,но не будет использоваться в классе Enemy, а get_knifes() с точностью да наоборот? Что делать с "ненужными генами" ?
сделать get_ammo и не париться)
А вообще, не получится определить только один из двух нереализованных (чисто виртуальных) методов. Для создания объекта класса, должны быть определены все методы, объявленные в нём.
netrino вне форума Ответить с цитированием
Старый 12.08.2011, 00:53   #5
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Эт я знаю. Ну я тогда просто возвращаю ноль, ибо их действительно у него нету. В принципе я разобрался. Спасибо. Только пихать health в private нельзя. Иначе при создании конструктора для класса Player вида:

Код:
Player(int he = 100){health = he;}
компиль ругается на то, что нету доступа к private элементам
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 12.08.2011, 00:59   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
class Man
{
private:
    int health;
public:
    Man(int _health):health(_health)
    {

    }
    virtual ~Man()
    {

    }
};

class Player:public Man
{
public:
    Player(int _health):Man(_health)
    {

    }
    virtual ~Player()
    {

    }
};
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 12.08.2011 в 01:00. Причина: public забыл
Пепел Феникса вне форума Ответить с цитированием
Старый 12.08.2011, 01:15   #7
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Хммммм Как полезно иногда задать глупый вопрос Спасибо.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 12.08.2011, 01:45   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

еще можно сделать такое:
Код:
class Man
{
private:
    int __health;
public:
    Man(int _health):__health(_health)
    {

    }
    virtual ~Man()
    {

    }
    int health()//get health
    {
        return __health;
    }
    void health(int _health)//set health, если надо
    {
        __health=_health;//тут можно сделать еще проверочку на maxhealth
    }
    void heal(int amount)
    {
        __health+=amount;
    }
    void injure(int amount)
    {
        if(__health<=amount)
        {
            __health=0;
        }
        else
        {
            __health-=amount;
        }
    }  
};
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.08.2011, 04:35   #9
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от MooNDeaR Посмотреть сообщение
Т.е. health и пр. перенести в секцию public класса man и наследовать?
Тогда надо будет определить класс Man как абстрактный и добавить в него чисто виртуальных методов?
Не обязательно, абстрактный класс нужен только для того, чтобы для него нельзя было создать объектов. Да и вообще виртуальные методы нужны только, если тип указателя не будет соответствовать типу объекта и еще при наследовании можно virtual указывать, тогда дублироваться не будет класс при множественном наследовании.
Можно переменную health в секцию protected и она будут использоваться наследниками.
An1ka вне форума Ответить с цитированием
Старый 12.08.2011, 12:25   #10
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
Да и вообще виртуальные методы нужны только, если тип указателя не будет соответствовать типу объекта
В принципе у меня там так и получалось.

Цитата:
еще можно сделать такое:
Это да Просто вопрос был на образном коде
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.

Последний раз редактировалось MooNDeaR; 12.08.2011 в 12:28.
MooNDeaR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Linq to Sql и наследование классов don_castello Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 1 15.06.2011 23:45
создание и наследование классов в С# Pavellavr Помощь студентам 2 25.03.2011 20:37
Наследование классов Serjuk Общие вопросы C/C++ 9 11.04.2010 16:25
наследование классов Dimarik Общие вопросы C/C++ 15 02.07.2009 20:00