--}}
Новая тема
Вы не можете создавать новые темы.
Т.к. вы неавторизованы на сайте. Пожалуйста назовите себя или зарегистрируйтесь.
Список тем

Что бы это значило? VisualCpp

5
38
С друзьями на NN.RU
В социальных сетях
Поделиться
Idol
18.02.2004
Здраствуйте!

Вот дали мне задание такого рода:
"
Параметры - вес и возраст. Действия - задание параметра с проверкой корректности, вычисление изменения параметра по сравнению с ранее заданным значением, преобразоване в текстовую строку.
"

И сказали, создать три класса:
один предок и два потомка
(для выполнения задания)


Что бы это могло быть? и какие классы создавать.
Кто помогет?
Catz
18.02.2004
Да уж... Лучше уточняй, то что здесь ты написал - мало понятно.
Alll
18.02.2004
Спросите на форуме C++.
Catz
18.02.2004
Было бы что спрашивать.
Максимум на один класс тянет. Что от него наследовать?
Catz
18.02.2004
Было бы что спрашивать.
Максимум на один класс тянет. Что от него наследовать?
Idol
18.02.2004
Вот и я думаю что на один класс ..
А препод хочет три ...
причем еще надо ему там показать:
полиморфизм, переопределение функций ....


Я вот что думаю (по функциям):
предок:
переменная: $id
функция работы со строками
потомки:
1) переменная: вес
функции работы с весом
2) переменная: рост
функции работы с ростом

больше в голову ни чего не приходит ....Catz писал(с)
----------------
Было бы что спрашивать.
Максимум на один класс тянет. Что от него наследовать?
Catz
19.02.2004
Ну сделай ему три класса таких:
class parent и class сын: public parent и class дочь: public parent.

функции вроде getdata в классе parent сделай виртуальными. А в классах наследниках переопределяй.

Похоже препод от тебя немного фантазии хочет?
Idol
19.02.2004
не понял ... ;(

Как то написал ты хитро ...

Я вотдаже думаю может еще и вот так:
класс главный
клас наследник (с весом и ростом)
класс наследник ( со статистикой изменения) ...


можешь объяснить нормально (доходчиво) твое предложение?
Catz
19.02.2004
Нееее... Все не так.
Даю кусок..

class parent {
private:
int weight;
int age;
public:
virtual void getdata()
{
Вывести вес;
Вывести возраст;
}
...
};

class son: public parent{
private:
int girlfriendcols; //Количество подружек Ж-)
public:
void getdata(){
parent::getdata();
Вывести кол-во подружек;
}
};

class daugter: public parent{
private:
int boyfriendcols; //Количество друзей Ж-)
public:
void getdata(){
parent::getdata();
Вывести кол-во друзей;
}
};

int main(){
person* pPerson[2];
pPerson[0] = new son;
pPerson[1] = new daugter;
for(int j=0; j<2; j++)
pPerson[j]->getdata();
return 0;
}

p.s Все набирал online так что ошибки если попадутся исправишь.
Смысл думаю ясен? Конструкторы и деструкторы, ввод данных и остальные ф-ии добавишь сам.
romich
20.02.2004
Вероятно имеется ввиду следующее:

//базовый класс
class base_class{
protected:
/* параметр, в одном производном класс будет весом в другом возрастом*/
float par;
public:
/*Задание параметра*/
virtual void set_param();
/*вычисление разницы*/
float diff(float x);
/*преобразование в строку*/
void tostring(char *buf );
};


А в производных классах переопределишь set_param(). Вот тебе и полиморфизм
Idol
20.02.2004
А можно чуть поподробнее ...
Параметры веса и роста хранить
каждый в своем классе??

Но тогда как можно будет вернуть
однавременно и возраст и рост
да и еще в виде строки например?
romich
24.02.2004
Idol писал(а)
А можно чуть поподробнее ...
Параметры веса и роста хранить
каждый в своем классе??


да, каждый в своем


Но тогда как можно будет вернуть
однавременно и возраст и рост
да и еще в виде строки например?


Из задания не следует что это нужно делать одной функцией. А если потребуется рост и вес вывести в одной строке, то можно из основной программы последовательно вызвать tostring() для каждого класса и затем результаты вывести
на экран. Например так:

//объявление экземпляров классов веса и роста
Weight wght;
Age ag;

//объявление массивов для хранения результата преобразования в строку
char w[80],a[80];

//преобразование роста и веса в строку
wght.tostring(w);
ag.tostring(a);

//вывод на экран
cout<<w<<ag;
Idol
24.02.2004
ТЕ сделать в предке вызов вида:
void setvalue(Weight *val);
void setvalue(Age *val);

и.т.д. ...

и в потомке их отрабатывать?
romich
24.02.2004
Нет, для установки параметров роста и веса есть функция set_param(), которая в производных классах занаследуется от базового.

Она должна выглядеть как-то так:

//это для веса
void Weight::set_param(){
cout<<"Введите вес:"<<endl;
cin>>par;
//здесь проверка коррекности
....
}

аналогично для возраста.

В основной программе для установки параметра будет использоваться

.....
//получаем вес
wght->set_param();
//получаем возраст
ag->set_param();
.......
Idol
24.02.2004
ТЕ использование virtual function?
В потомках вводить данные, которые хранятся в базовом классе?


Если не сложно ... не мог бы ты написать как примерно должна быглядеться vitrual set_param() в base_class (в родителе) ...
в потомке понятно ...
romich
24.02.2004
Idol писал(а)
ТЕ использование virtual function?
В потомках вводить данные, которые хранятся в базовом классе?


Данные хранятся не базовом и не производном классе. Данные хранятся в экземпляре класса.

т.е. когда пишется что-то типа
Weight wght;
создается экземпляр класса Weight(производного от base_class)с именем wght в котором и хранятся данные.
Когда ты пишешь
wght.set_param();
ты вызываешь set_param() именно для объекта wght а не для класса.


Если не сложно ... не мог бы ты написать как примерно должна быглядеться vitrual set_param() в base_class (в родителе) ...
в потомке понятно ...


Исходя из вышесказанного следует, что в базовом классе set_param() достаточно просто объявить, как это было в самом первом примере.
А конкретная реализация оставляется на производные классы.

кстати, этот факт можно подчеркнуть в описанни базового класса:
class base_class{
........
/*теперь эта функция будет называться чисто фиртуальной(т.е. функция которая определяется только в производных классах)*/
virtual void set_param()=0;
......
};
Idol
29.03.2004
Господа!
Очередная не понятнка ...
помогайте ....

Надо организовать программу так что-бы базовый класс не знал про предков, и работал с ними ...
как это сделать??

Если грубо:
#include <stdafx.h>
#include <stddef.h>
#include <string.h>
class CAbstrBaseClass
{
protected:
int param;
public:
virtual void set_parm() = 0;
};

class CAbstrAge: public CAbstrBaseClass
{
void set_parm();
};

void CAbstrAge::set_parm()
{
};


int main(int argc, char* argv[])
{
CAbstrAge Age;
Age->set_parm();
return 0;
}

Мы получаем:
1. ошибки вида:
1: type 'CAbstrAge' does not have an overloaded member 'operator ->'
2: left of '->set_parm' must point to class/struct/union

2. Как я понимаю, в программе мы точно знаем к какому классу относится Age .. -> на кой нужен базовый класс?
1020
29.03.2004
Мля, ты бы сначала книжек по с++ почитал прежде чем для объекта -> применять!
Catz
24.02.2004
Блин.. Да я же тебе все расписал раньше... чего не хватает?
Idol
29.03.2004
См ответ romich`у

не понятно очень многое как выяснаяется ....

помогайте ... plzzz
Catz
29.03.2004
type 'CAbstrAge' does not have an overloaded member 'operator ->'

Надо определять указатель!
Idol
29.03.2004
А поподробнее?
Catz
29.03.2004
CAbstrAge Age;

Здесь ты создаешь объект а не указатель.
А хочешь использовать операцию ->
Idol
29.03.2004
Вот смотри что получается ...
Я ведь могу сделать и так:

Age.set_parm();

Но тогда:
будет вызван set_parm() из класса CAbstrAge.

Но накой тоды писать
virtual void set_parm()=0;
в базовом(предке) классе?
ведь он вообще ни когда не будет вызван ...
-> накой вообще надыть предок!!!

И получается, что задачу я решаю не правильно... типа преп. задание дал (вверху самом писанно), а я его решаю по иному ...

а надыть как он хочет ...

кто что скажет??
to Catz:
буду рад если помогешь ... даже пывом проставлюсь (или чем захочешь).
romich
29.03.2004
Но накой тоды писать
virtual void set_parm()=0;
в базовом(предке) классе?
ведь он вообще ни когда не будет вызван ...
-> накой вообще надыть предок!!!

Предположим тебе нужна функция, которая умеет манипулировать объктами типа CAbstrAge и CAbstrWeight.
Тогда имея базовый класс с абстрактыми функциями ты можешь делать как-нибудь так:

/*
фунция set() получает указатель на базовый класс, но на самом деле туда можно передать указатель на любой из дочерних классов(см. ниже), а вызываться будет set_parm() из того класса, для которого был указатель.
если в базовом классе не описать виртуальную функцию set_parm()=0
то этот фокус не сработает.
*/
void set(CAbstrBaseClass *b){
b->set_parm();
}

int main(){
CAbstrAge *Age;
CAbstrWeight *Weight;

Age=new CAbstrAge;
Weight=new CAbstrWeight;

/* передается указатель на объект типа CAbstrAge
*/
set(Age);
/* передается указатель на объект типа CAbstrWeight
*/
set(Weight);
return 0;
}




И получается, что задачу я решаю не правильно... типа преп. задание дал (вверху самом писанно), а я его решаю по иному ...


Так что задачу ты решаешь именно так как хочет препод.
Idol
30.03.2004
Так ...
консультировался с преподом ...

мне сказали что надо продемонстрировать:
что-бы работать с потомками не зная о них ... т.е. работа с потомками через предка ....

Как я понимаю, когда мы делаем:
Width wdth;
wdth.set_param();
мы работаем именно с классом потомка ...
или я в чем-то не прав???
romich
30.03.2004
Idol писал(а)
т.е. работа с потомками через предка ....


т.е. через указатель на объект типа базового класса, о чем и шла речь в моем предыдущем примере


Как я понимаю, когда мы делаем:
Width wdth;
wdth.set_param();
мы работаем именно с классом потомка ...
или я в чем-то не прав???

да с объектом производного класса но не "через предка".
Idol
30.03.2004
Извиняюсь ... достал наверное ...
но ...
ни как не могу понять одну весч ...

Как сделать работу с потомками через предка ...
как это вообще представляется??

если не сложно, можно кусочек кода на всидку для моего примера (возраст/вес)

точнее, в понимании затык на том, как происходит обработка width->set_pram() при указании width - указатель на предка!

может кто поможет ...
Catz
30.03.2004
Вот в самом раннем посте я тебе приводил пример
---------------------
person* pPerson[2];
pPerson[0] = new son;
pPerson[1] = new daugter;
for(int j=0; j<2; j++)
pPerson[j]->getdata();
return 0;
---------------------
Здесь ты и работаешь с "потомками через предка".
Idol
30.03.2004
Те, если я правильно понял:
создается person* (область памяти, указаель) в нем создается объект son (= new son) .. ->
при вызове
person->set_parm() будет вызван
именно функции parson (как базового класса) и son (как предка) ...

я правильно понял??
Idol
31.03.2004
Не сочтите за труд ...
Посмотрите, может правильно все сделал ... пока написал только два класса ... по поводу возраста он подобен весу, с небольшими изменениями .....

#include "stdafx.h"

class CAbstrBody
{
protected:
float parm;
int err_code;
bool error;

public:
virtual void set_values_ask()=0;
virtual void set_values(float x)=0;
virtual float get_values()=0;
virtual float get_diff(float x)=0;
};

class CAbstrWeight: public CAbstrBody
{
private:
float temp;
public:
// Ôóíêöèÿ óñòàíîâêè çäíà?åíèÿ ?åðåç ââîäà ñ êëàâèàòóðû
void set_values_ask()
{
cout<<"Ââåäèòå âåñ:"<<endl;
cin>>temp;
if ( (temp > 0) && (temp < 400) )
{
err_code=0;error=false;
parm = temp;
};
};
// Ôóíêöèÿ óñòàíîâêè çíà?åíèÿ ?åðåç ïàðàìåòð
void set_values(float x)
{
if ( (x > 0) && (x < 300) )
{
err_code=0;error=false;
parm = x;
}
else
{
err_code=1;error=true;
};
};
// Ôóíêöèÿ ïîëó?åíèÿ ïàðàìåòðà
float get_values()
{
return parm;
};
// Ôóíêöèÿ ïîäñ?åòà ðàçäíèöû ìåæäó çíà?åíèÿìè
float get_diff(float x)
{
temp = parm - x;
return temp;
};

};

int main(int argc, char* argv[])
{
CAbstrBody *body;
float date;
body = new CAbstrWeight;
body -> set_values_ask();
body -> set_values(12);
date = body->get_values();
return 0;
}


Надеюсь все верно?
Idol
31.03.2004
И еще три вопроса:
1. Как преобразовать float в строку.
2. И что есть строка на visual c++
Это часом нет: char name[30]
(для примера)
3. Как вывести строку на экран?
Idol
31.03.2004
В догонку еще вопрос ...

а как передать в процедуру строку?
типа void print("dedede");
????
и как правильно определить такую процедуру ...
Catz
31.03.2004
У как много вопросов.... Лениво.
Про строки используй std::string.
Вывод строки :)
std::string s1;
s1 = "TEST";
cout << s1;

Строка передается как и все остальное.
CSSO
01.04.2004
Catz писал(а)

cout << s1;


std::cout<<<< s1 << std::endl; :))
CSSO
01.04.2004
std::cout<<s1<<std::endl; то бишь.
Catz
01.04.2004
:)
то бишь using namespace std;
:)
CSSO
01.04.2004
std::copy(str.begin(), str.end(), std::ostream_iterator<char>(std::cout));

пусть преподу станет нехорошо :)
Новая тема
Вы не можете создавать новые темы.
Т.к. вы неавторизованы на сайте. Пожалуйста назовите себя или зарегистрируйтесь.
Список тем
Последние темы форумов
Форум Тема (Автор) Последний ответ Ответов
Материнские платы на запчасти и не только

Материнские платы на запчасти и не только Материнские платы и другие комплектующие Отправка в регионы после оплаты. Транспортной...
Цена: 3 000 руб.

Принтер лазерный HEWLETT PACKARD HP-6L

Принтер лазерный HEWLETT PACKARD HP-6L Отправка в регионы после оплаты. 3штуки БУ. Внешний вид из магазина простояли на складе...
Цена: 4 500 руб.

Оперативная память Corsair XMS3 CMX8GX3M2A1600C9

Оперативная память Corsair XMS3 CMX8GX3M2A1600C9 Отправка в регионы после оплаты. Продаются сразу обе. Цена за обе 2000 руб....
Цена: 1 000 руб.

Сетевой фильтр APC Surge Arrest

Сетевой фильтр APC Surge Arrest для радиолюбителя.и не только Отправка в регионы после оплаты. ЦЕНА 3000 руб. В рабочем состоянии....
Цена: 3 000 руб.