Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
#1

виртуальные функции - C++

09.08.2011, 21:13. Просмотров 1101. Ответов 21
Метки нет (Все метки)

Всем привет, помогите с исправлением функции
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include<iostream.h>
#include<conio.h>
#include<string.h>
 
enum Shape{prizm,parallelepiped,cube,pyramid,cone,cylinder};
 
class Body
{   private:
  char* Name;
  Shape shape_s;
  float H,So,Sb,Sp,V,p,k;
 
   public:
  Body(char* name,Shape s);
  ~Body();
  float get_V();
  virtual float get_H(float H)const=0;
  virtual float get_So(float So)const=0;
  virtual float get_Sb(float Sb)const=0;
  virtual float get_Sp(float Sp)const=0;
  void Display();
};
 
  Body::Body(char *name,Shape s)
{  Name=new char[strlen(name)+1];
   strcpy(Name,name);
   shape_s=s;
   switch(s)
          {
            case prizm:          k=1.0;                  break;
            case parallelepiped: k=1.0;                  break;
            case cube:           k=1.0;                  break;
            case pyramid:        k=1.0/3.0;              break;
            case cone:           k=1.0/3.0;              break;
            case cylinder:       k=1.0;                  break;
            default:cout<<"Неизвестная фигура."; break;
          } if(k!=0){ get_V(); }
}
 
  Body::~Body()
  {delete[]Name;}
 
  float Body::get_V()
  {float V=So*H*k; return V;}
 
 
   void Body::Display()
  {cout<<"Имя объекта - "<<Name<<"."<<endl;
   cout<<"Форма объекта - "<<shape_s<<"."<<endl;
   cout<<"Площадь основания равна:                 \tSo="<<So<<endl;
   cout<<"Площадь боковой поверхности равна:       \tSb="<<Sb<<endl;
   cout<<"Площадь полной поверхности равна:        \tSp="<<Sp<<endl;
   cout<<"Объем обекта равен:                      \tV="<<get_V()<<endl;}
 
class class_prizm:public Body
{   public:
  class_prizm(char *name,Shape s,float H,float So,float Sb,float Sp):Body(name,s)
 {
  float get_H(H)
  {return H;}
  float get_So(So)
  {return So;}
  float get_Sb(Sb)
  {return Sb;}
  float get_Sp(Sp)
  {return Sp;}
 }
};
[C++ Error] Unit1.cpp(60): E2141 Declaration syntax error
[C++ Error] Unit1.cpp(67): E2139 Declaration missing ;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2011, 21:13     виртуальные функции
Посмотрите здесь:

Виртуальные функции - C++
Пытаюсь понять что это такое но не понимаю. Может есть какие то болие понятные примеры , а то то что я смотрел не дало результата. ...

Виртуальные функции - C++
Подскажите пожалуйста, как передать переменную из одной виртуальной функции в другую. Вот код программы работает правильно, но в остальных...

виртуальные функции - C++
Помогите плиз с вертуальными функциями. Некак немогу понят вот эту задачу: переопределяемая виртуальная функция находит: ...

Виртуальные функции - C++
Здравствуйте,уважаемые посетители форума.Пишу программу созданию фигур и их перемещению на экране использую виртуальные функции.И...

Виртуальные функции - C++
Вопрос. Как вызвать функцию наследника через указатель на базовый класс? Так не компилируется 3.cpp:19:19: error: invalid covariant...

Виртуальные функции - C++
Помогите пожалуйста написать задачу, никак не могу разобраться. Создайте класс Matr, определите в нем виртуальную функцию-член...

Виртуальные функции - C++
Здрасте! вот задачка, какбэ сделал, но нужны виртуальные функции. даже не знаю как их сделать. #include &lt;iostream.h&gt; #include...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,251
Записей в блоге: 1
Завершенные тесты: 1
09.08.2011, 21:21     виртуальные функции #2
C++
1
2
3
4
5
6
7
8
float get_H(H)
  {return H;}
  float get_So(So)
  {return So;}
  float get_Sb(Sb)
  {return Sb;}
  float get_Sp(Sp)
  {return Sp;}
Код вообще не читабельный. Ошибка в том, что нет типов аргументов, т.е.
C++
1
2
3
float get_H(float H)
  {return H;}
//и т.д.
Только я смысла в этих функциях не вижу, возвращать передаваемый аргумент...

Добавлено через 3 минуты
Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
{
 float get_H(H)
 {return H;}
 float get_So(So)
 {return So;}
 float get_Sb(Sb)
 {return Sb;}
 float get_Sp(Sp)
 {return Sp;}
 }
стоп, это что тело конструктора? или очепятка?
Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
09.08.2011, 21:24  [ТС]     виртуальные функции #3
Извините, я начинаю программировать только, но как тогда написать чтобы значения переменных передавались через функции?
Заранее спасибо

Добавлено через 48 секунд
да, это тело конструктора
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,251
Записей в блоге: 1
Завершенные тесты: 1
09.08.2011, 21:25     виртуальные функции #4
Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
но как тогда написать чтобы значения переменных передавались через функции?
Какие переменные и куда должны передоваться?
Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
09.08.2011, 21:28  [ТС]     виртуальные функции #5
переменные H,So,Sp,Sb в функции get_H(),get_So() и т.д
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
09.08.2011, 22:49     виртуальные функции #6
Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
переменные H,So,Sp,Sb в функции get_H(),get_So() и т.д
эм, зачем?
опишите конкретно суть задачи, которую вы хотите выполнить.
Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
10.08.2011, 01:09  [ТС]     виртуальные функции #7
конкретнее если описыавть то тогда следующим образом:
1) значения переменных H,So,Sb,Sp базового класса необходимо установить в конструкторе производного класса посредством выполнения функций get_H(),get_So() и т.д.производного класса;
2) сделать эти функции чисто виртуальными, с учетом будущей подмены соответствующими функциями производных классов
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
10.08.2011, 01:28     виртуальные функции #8
всегда думал что get отдает значение, а set устанавливает.
кстати логика у вас тоже описана для отдачи, а не установки.
если всеже вы сознательно через get хотите устанавливать (зачем оО), то.
не
C++
1
2
float get_H(H)
  {return H;}
а
C++
1
2
3
4
float get_H(H)
{
   return this->H=H;
}
и т.д.
И вообще что за бред?)
вы в функции описываете другие функции, что вообще не допустим.
описывать в классе, а в конструкторе только вызывать.
Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
10.08.2011, 01:42  [ТС]     виртуальные функции #9
вот интересно, видно что в разделе для начинающих, в книге так написано, книгу женщина писала, а функции можно называть как угодно (хоть sit), не я эту книгу писал, по существу пожалуйста подскажите
извините, но я надеюсь, что никого не обидел

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

Добавлено через 6 минут
Извините, silentnuke, а подскажите тогда как делать с этим вышеупомянутое
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include<iostream.h>
#include<conio.h>
#include<string.h>
 
enum Shape{prizm,parallelepiped,cube,pyramid,cone,cylinder};
 
static char* Shapes[]={"prizm","parallelepiped","cube","pyramid","cone","cylinder"};
 
class Body
{
   private:
  char* Name;
  Shape shape_s;
  float H,So,Sb,Sp,V,p,k;
 
   public:
  Body(char* name,Shape s);
  ~Body();
  float get_V();
  float get_H1(float H);
  float get_So1(float So);
  float get_Sb1(float Sb);
  float get_Sp1(float Sp);
  virtual float get_H2()const=0;
  virtual float get_So2()const=0;
  virtual float get_Sb2()const=0;
  virtual float get_Sp2()const=0;
  void Display();
};
 
  Body::Body(char *name,Shape s)
{
   Name=new char[strlen(name)+1];
   strcpy(Name,name);
   shape_s=s;
   switch(s)
          {
            case prizm:          k=1.0;                  break;
            case parallelepiped: k=1.0;                  break;
            case cube:           k=1.0;                  break;
            case pyramid:        k=1.0/3.0;              break;
            case cone:           k=1.0/3.0;              break;
            case cylinder:       k=1.0;                  break;
            default:cout<<"Неизвестная фигура."; break;
          } if(k!=0){ get_V(); }
}
 
  Body::~Body()
  {delete[]Name;}
 
  float Body::get_V()
  {float V=So*H*k; return V;}
 
  float Body::get_H1(float H)
  {this->H=H; return H;}
  float Body::get_So1(float So)
  {this->So=So; return So;}
  float Body::get_Sb1(float Sb)
  {this->Sb=Sb; return Sb;}
  float Body::get_Sp1(float Sp)
  {this->Sp=Sp; return Sp;}
 
   void Body::Display()
  {
   cout<<"Имя объекта - "<<Name<<"."<<endl;
   cout<<"Форма объекта - "<<shape_s<<"."<<endl;
   cout<<"Площадь основания равна:                 \tSo="<<So<<endl;
   cout<<"Площадь боковой поверхности равна:       \tSb="<<Sb<<endl;
   cout<<"Площадь полной поверхности равна:        \tSp="<<Sp<<endl;
   cout<<"Объем обекта равен:                      \tV="<<get_V()<<endl;
  }
 
class class_prizm:public Body
{
   public:
  class_prizm(char *name,Shape s,float H,float So,float Sb,float Sp):Body(name,s)
 {get_H1(H);
  get_So1(So);
  get_Sb1(Sb);
  get_Sp1(Sp);}
};
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
10.08.2011, 01:57     виртуальные функции #10
все нормально)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include<iostream.h>
#include<conio.h>
#include<string.h>
enum Shape{prizm,parallelepiped,cube,pyramid,cone,cylinder};
 
class Body
{   
protected:
    char* Name;
    Shape shape_s;
    float H,So,Sb,Sp,V,p,k;
 
public:
    Body(char* name,Shape s);
    ~Body();
    float get_V();
    virtual void set_H(float H)=0;
    virtual void set_So(float So)=0;
    virtual void set_Sb(float Sb)=0;
    virtual void set_Sp(float Sp)=0;
    void Display();
};
 
Body::Body(char *name,Shape s)
{  
    Name=new char[strlen(name)+1];
    strcpy(Name,name);
    shape_s=s;
    switch(s)
    {
        case prizm:          
            k=1.0;                  
            break;
        case parallelepiped: 
            k=1.0;                  
            break;
        case cube:           
            k=1.0;                  
            break;
        case pyramid:        
            k=1.0/3.0;              
            break;
        case cone:           
            k=1.0/3.0;              
            break;
        case cylinder:       
            k=1.0;                  
            break;
        default:
            cout<<"Неизвестная фигура."; 
            break;
    } 
    if(k!=0){ get_V(); }
}
 
Body::~Body()
{
    delete[]Name;
}
 
float Body::get_V()
{
    float V=So*H*k; 
    return V;
}
 
 
void Body::Display()
{
    cout<<"Имя объекта - "<<Name<<"."<<endl;
    cout<<"Форма объекта - "<<shape_s<<"."<<endl;
    cout<<"Площадь основания равна:                 \tSo="<<So<<endl;
    cout<<"Площадь боковой поверхности равна:       \tSb="<<Sb<<endl;
    cout<<"Площадь полной поверхности равна:        \tSp="<<Sp<<endl;
    cout<<"Объем обекта равен:                      \tV="<<get_V()<<endl;
}
 
class class_prizm:public Body
{   
public:
    class_prizm(char *name,Shape s,float H,float So,float Sb,float Sp):Body(name,s)
    {
        set_H(H);
        set_So(So);
        set_Sb(Sb);
        set_Sp(Sp);
    }
    void set_H(float H){this->H=H;}
    void set_So(float So){this->So=So;}
    void set_Sb(float Sb){this->Sb=Sb;}
    void set_Sp(float Sp){this->Sp=Sp;}
};
вот рабочий код.
кстати насчет наследования на заметку.
Вы в базовом классе объявили переменные в private.
Потом наследуетесь. Но при наследование, у класса наследника не будет этих полей, ибо все что private не наследуется. Поэтому тут лучше использовать protected.
Да и форматируйте код, а то вообще не читабельно.
Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
10.08.2011, 02:02  [ТС]     виртуальные функции #11
Огромное человеческое Вам спасибо, извините за наглость, но как эти чудеса вызывать в main(),
я не совсем бум-бум, еще раз огромное спасибо
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
10.08.2011, 02:05     виртуальные функции #12
C++
1
2
3
4
5
6
int main()
{
    class_prizm obj("test",prizm,2.0,3.0,4.0,5.0);
    obj.Display();
        return 0;
}
Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
10.08.2011, 02:13  [ТС]     виртуальные функции #13
Я просто в книгах такое видел. например:
void main()
{
Base *poly=new Derived;
poly->show_message();
poly->show message1();
}, где базе -базовый класс, а derived-производный, а тут так просто
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
10.08.2011, 02:14     виртуальные функции #14
ну можно и так.
тут все от целей зависит.

C++
1
2
3
4
5
6
int main()
{
        Body *obj=new class_prizm("test",prizm,2.0,3.0,4.0,5.0);
        obj->Display();
        return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2011, 02:25     виртуальные функции
Еще ссылки по теме:

Виртуальные функции - C++
Объясните, для чего необходимы виртуальные функции. Где их рационально использовать. P.S. Если есть ссылки на толковые материалы - не...

виртуальные функции - C++
ввести виртуальную функцию class A { void init(); } classB:A { void init(); }

виртуальные функции - C++
Здравствуйте.Перечитал различные статьи,но не могу до конца вникнуть в смысл использования виртуальных функций.Для взаимного понимания...

виртуальные функции - C++
Добрый день. Начал изучать виртуальные функции и столкнулся с проблемой. Не могу перегрузить функцию. Объясните что не так и как нужно: ...

Виртуальные функции - C++
Составить программу в С Buildere. Объявить базовый класс с именем person {имя, возраст, группа}. Определить функцию show (), которая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
10.08.2011, 02:25  [ТС]     виртуальные функции #15
А если вотето чудо также выводить
C++
1
2
3
4
5
6
7
8
float Body::set_H(float H)
  {this->H=H; return H;}
  float Body::set_So(float So)
  {this->So=So; return So;}
  float Body::set_Sb(float Sb)
  {this->Sb=Sb; return Sb;}
  float Body::set_Sp(float Sp)
  {this->Sp=Sp; return Sp;}
то будут ошибки, а можно 2 раза выводить с помощью вот этих функций и виртуальных одновременно, подскажите пожалуйста чтобы окончательно разобраться
silentnuke, Вы очень приятный в общении человек, поклон Вам до Земли-матушки))

Добавлено через 4 минуты
Извините за наглость, я просто хочу разобраться, а то в книгах легкие примеры да и разжевывают, а тут сел да и сел в калошу((
Yandex
Объявления
10.08.2011, 02:25     виртуальные функции
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru