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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Mr. Pyatachok
 Аватар для Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
09.08.2011, 21:13     виртуальные функции #1
Всем привет, помогите с исправлением функции
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++ Виртуальные функции
Виртуальные функции C++
C++ Виртуальные функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4248 / 2780 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 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
 Аватар для Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
09.08.2011, 21:24  [ТС]     виртуальные функции #3
Извините, я начинаю программировать только, но как тогда написать чтобы значения переменных передавались через функции?
Заранее спасибо

Добавлено через 48 секунд
да, это тело конструктора
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4248 / 2780 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
09.08.2011, 21:25     виртуальные функции #4
Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
но как тогда написать чтобы значения переменных передавались через функции?
Какие переменные и куда должны передоваться?
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
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
09.08.2011, 22:49     виртуальные функции #6
Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
переменные H,So,Sp,Sb в функции get_H(),get_So() и т.д
эм, зачем?
опишите конкретно суть задачи, которую вы хотите выполнить.
Mr. Pyatachok
 Аватар для 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
137 / 138 / 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
 Аватар для 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
137 / 138 / 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
 Аватар для Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
10.08.2011, 02:02  [ТС]     виртуальные функции #11
Огромное человеческое Вам спасибо, извините за наглость, но как эти чудеса вызывать в main(),
я не совсем бум-бум, еще раз огромное спасибо
silentnuke
Android Programmer
137 / 138 / 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
 Аватар для 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
137 / 138 / 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;
}
Mr. Pyatachok
 Аватар для 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 минуты
Извините за наглость, я просто хочу разобраться, а то в книгах легкие примеры да и разжевывают, а тут сел да и сел в калошу((
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
10.08.2011, 02:27     виртуальные функции #16
Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
А если вотето чудо также выводить
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 минуты
Извините за наглость, я просто хочу разобраться, а то в книгах легкие примеры да и разжевывают, а тут сел да и сел в калошу((
хм, не понял сути вопроса.
да и зачем устанавливать значение, и потом ещё возвращать значение которое передали.
опишите всеже чего хотите добиться этим, а ещё лучше суть задания, которое нужно выполнить.
Mr. Pyatachok
 Аватар для Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
10.08.2011, 02:50  [ТС]     виртуальные функции #17
Извините, а Вы сможете посидеть немного и объяснить мне немного моих огрехов в этом задании, я Вас не слишком утруждаю, задание сейчас напишу

Добавлено через 15 минут
Дано глобальное перечисление enum shape, необходимо было разработать базовый класс Body, который содержит закрытые переменные H,So,Sp,Sb,V,перменную закрытого типа shape, характеризующую форму объекта. Конструктор базового класса должен именовать объект,
значения же H,So,Sp и Sb базового класса установит с помощью функиций get_H(),So() и т.д. производного класса,
а далее с виртуальными я с Вами разобрался, я просто хотел бы вывести и так и этак

Добавлено через 4 минуты
одновременно вывести, чтобы при помощи виртуальных функций и обыкновенных, чтобы показывало результат до и после))
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
10.08.2011, 02:55     виртуальные функции #18
эм, что вывести?
у вас функции get задают значение полям класса.
а выводит данные функция Display().
Mr. Pyatachok
 Аватар для Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
10.08.2011, 03:02  [ТС]     виртуальные функции #19
Ай я да дурак!
C++
1
2
3
4
5
6
7
8
9
10
11
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;}
Не по-русски написал, все ж есть, получается что здесь функции 2 раза вызываются так же?
напр. set_H(H); и void set_H(float H){this->H=H;}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2011, 03:17     виртуальные функции
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
10.08.2011, 03:17     виртуальные функции #20
Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
Ай я да дурак!
C++
1
2
3
4
5
6
7
8
9
10
11
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;}
Не по-русски написал, все ж есть, получается что здесь функции 2 раза вызываются так же?
напр. set_H(H); и void set_H(float H){this->H=H;}
set_H(H); - вызов функции
а void set_H(float H){this->H=H;} - определение чисто виртуальной функции set_H.
поскольку у вас в базовом классе, функции созданы чисто виртуальными, то вам в классе наследнике обязательно нужно переопределить функции, иначе не сможете создать объект класса, т.к он будет считаться абстрактным..
Yandex
Объявления
10.08.2011, 03:17     виртуальные функции
Ответ Создать тему
Опции темы

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