Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C++ множественное наследование 
V
    Опции темы
Storm_tpv
Дата 14.12.2007, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 4.12.2006

Репутация: нет
Всего: нет



Здаствуйте!
Я вот начал изучать тему множественного наследования.
и передо мной встала задача: написать след программу.
    Создать иерархии наследования: удочка, телескоп – телескопическая удочка.

Я почитал теории, пробовал и так и сяк, но ошибка появляется.
Я не знаю как бы мне изменить другие классы от udocika_teleskop
хочу передать в остальные классы данные созданные этим классом.
Вот что я написал.
Помогите понять или исправить ошибку.

Код

#include <iostream.h>
class udocika
{
protected:
    int length;
    double leska;
public:
    udocika():length(0), leska(0.0) {}
    udocika(int lh, double ls):
    length(lh), leska(ls) {}
    udocika(const udocika &ud):
    length(ud.length), leska(ud.leska) {}
    void getl(udocika &u, int length) 
    { 
        cout << "length:" << length << endl;
        cout << "leska:" << u.leska << endl;
    }
};

class teleskop
{
protected:
    int dlina;
    double dlina_leska;
public:
    teleskop():dlina(0), dlina_leska(0.0) {}
    teleskop(int dl, double ds):
    dlina(dl), dlina_leska(ds) {}
    teleskop(const teleskop &tl):
    dlina(tl.dlina), dlina_leska(tl.dlina_leska) {}
    void gett()
    { 
        cout << "length:" << dlina << endl;
        cout << "leska:" << dlina_leska << endl;
    }
};

class udocika_teleskop: public udocika, public teleskop
{
public:
    udocika_teleskop():udocika(), teleskop() {}
    udocika_teleskop(int ut, double dt):
    udocika(ut, 0.0), teleskop(0, dt) {}
    udocika_teleskop(const udocika_teleskop &udt):
    udocika(udt), teleskop(udt) {}
    void get() 
    {
        cout << "length2:" << length << endl;
        cout << "dlina2:" << dlina_leska << endl;
    }
};

void main()
{
    udocika_teleskop p;
    udocika m;
    p.get();
    udocika_teleskop s(50, 33.4);
    s.getl(m, p);
    s.gett();
}

PM MAIL   Вверх
JackYF
Дата 15.12.2007, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Storm_tpv @  14.12.2007,  23:59 Найти цитируемый пост)
Я почитал теории, пробовал и так и сяк, но ошибка появляется.

Укажи её, мы не телепаты. И номер строки, на которую ругается компилятор.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Storm_tpv
Дата 15.12.2007, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 4.12.2006

Репутация: нет
Всего: нет



Не могли бы вы в майне создать переменную класса udocika_teleskop чтобы она могла бы вызывать оба класса.
вот как здесь пример. Я не понимаю как мне это повторить:

class Student{
public:
  int mark;
...
};
class Worker{
public:
  int salary;
};
class Practicant: public Student, public Worker{
};
void PutMark(Student& s, int mark){
 s.mark = mark;
}
void PutSalary(Worker& w, int salary){
 w. salary = salary;
}

void main(){
Practicant p;
    PutMark(p,5);
    PutSalary(p,200);
}


Мне бы только в майне, остальное я описал уже.
Спасибо
PM MAIL   Вверх
Storm_tpv
Дата 15.12.2007, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 4.12.2006

Репутация: нет
Всего: нет



Правильно я сделал?
У меня соменения, я не уверен, помогите пожалуйста.

Код

#include <iostream.h>
class udocika
{
protected:
    int length;
    double leska;
public:
    udocika():length(0), leska(0.0) {}
    udocika(int lh, double ls):
    length(lh), leska(ls) {}
    udocika(const udocika &ud):
    length(ud.length), leska(ud.leska) {}
    void getl() const
    { 
        cout << "length0:" << length << endl;
        cout << "leska0:" << leska << endl;
    }
};

class teleskop
{
protected:
    int dlina;
    double dlina_leska;
public:
    teleskop():dlina(0), dlina_leska(0.0) {}
    teleskop(int dl, double ds):
    dlina(dl), dlina_leska(ds) {}
    teleskop(const teleskop &tl):
    dlina(tl.dlina), dlina_leska(tl.dlina_leska) {}
    void gett() const
    { 
        cout << "length1:" << dlina << endl;
        cout << "leska1:" << dlina_leska << endl;
    }
};

class udocika_teleskop: public udocika, public teleskop
{
public:
    udocika_teleskop():udocika(), teleskop() {}
    udocika_teleskop(int ut, double dt):
    udocika(ut, 0.0), teleskop(0, dt) {}
    udocika_teleskop(const udocika_teleskop &udt):
    udocika(udt), teleskop(udt) {}
    void get() const
    {
        cout << "length2:" << length << endl;
        cout << "dlina2:" << dlina_leska << endl;
    }
};

void main()
{
    udocika_teleskop p;
    p.get();
    udocika_teleskop s(2,3);
    s.getl();
    udocika_teleskop k(5,1);
    k.gett();
}


Это сообщение отредактировал(а) Storm_tpv - 15.12.2007, 00:37
PM MAIL   Вверх
crazy_hand
Дата 15.12.2007, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 12.12.2007
Где: Санкт-Петербург

Репутация: нет
Всего: нет



ты в main вызываешь функцию getl класса udocika. Прототип: 
Код
void getl(udocika &u, int length) ;

а ты ей вторым параметром передаешь не int а объект класса udocika_teleskop. В этом и ошибка. А вообще приучайся писать с директивами препроцессора #ifndef,#define,#endif, а так же разделять интерфейс и реализацию, определяй сам класс в .h файлы - его методы в .cpp файле. И названия классов гораздо лучше смотрятся, если они написаны по-английски =)



Это сообщение отредактировал(а) crazy_hand - 15.12.2007, 01:32
PM MAIL ICQ   Вверх
Storm_tpv
Дата 15.12.2007, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 4.12.2006

Репутация: нет
Всего: нет



Все я понял:
По условию задания я правильно вызвал и определил?

для класса udocika
Код

void getl(udocika &u, int length)
    { 
        cout << "length0:" << length << endl;
        cout << "leska0:" << u.leska << endl;
    }


а вот main
Код

udocika_teleskop s;
    s.getl(s,5);

PM MAIL   Вверх
crazy_hand
Дата 15.12.2007, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 12.12.2007
Где: Санкт-Петербург

Репутация: нет
Всего: нет



ну лично мне больше нравится второй вариант твой. Но в конечном счете все определяется твоими задачами и поставленными целями. Но вообще, я бы посоветовал(как меня учили и как я стараюсь писать) писать так: в базовом классе определяется 2-а метода, один открытый, а другой защищенный(виртуальный). Открытый внутри себя вызывает защищенный. Защищео нный, если нужно, в классах-потомках переопределяется.
PM MAIL ICQ   Вверх
chipset
Дата 17.12.2007, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



А где у тебя там аналогия с Student, Worker, Practicant? Суть в эталонной задаче в правильном выборе из перегруженных функций. А в твоем коде я вообще не вижу перегруженных функций которые заточены под удочку и телескоп.
Короче задача непонятна smile


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
regis
Дата 17.12.2007, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 12.12.2005
Где: Москва, Россия

Репутация: 2
Всего: 7



От себя добавлю, что пример выбран какой-то неудачный. ;(

(Когда применяем множественное наследование, предполагается наследование классом свойств от двух (или более) суперклассов. А удочка-телескоп, очевидно, много наследует от удочки, но как-то очень мало -- от телескопа.)

--------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1541 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.