Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.58/19: Рейтинг темы: голосов - 19, средняя оценка - 4.58
15 / 15 / 2
Регистрация: 24.08.2010
Сообщений: 94
1

Указатель на виртуальный класс

28.08.2010, 22:49. Показов 3782. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Например у меня есть виртуальный класс Food и его нащадок Drink:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Food      
{
public:
    Food (int m) {Weight = m;};
    ~Food ();
    virtual int GetWeight() = 0;
protected:
    int Weight;
};
 
//Child class
class Drink: public Food
{
public:
    Drink (int v);
    virtual int GetWeight () {return Weight;};
private:
    int Capacity;
};
Почему нельзя в функции main обьявить указатели на виртуальный клас Food без инициализации (как в первой строке)? Если его сразу инициализовать тогда ошибки нет (как во второй строке):
C++
1
2
3
4
5
6
int main ()
{
    Food *Juice, Wodka;
        Food *Tea = new Drink (400);
        return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2010, 22:49
Ответы с готовыми решениями:

Указатель на виртуальный метод
По мотивам какого-то вопроса тут возник вопрос, ответ на который я что-то не придумал. Как взять...

виртуальный табличный указатель
виртуальным табличным указателем vptr (указатель на таблицу виртуальных методов класса, которому...

Указатель на указатель, класс группа
помогите пожалуйста не могу понять что со строкой 312 знаю что с указателем что то не то......

Виртуальный абстрактный класс
Надеюсь мой вопрос будет не глупым. Есть класс исключений в пространстве имен std У него есть...

23
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
28.08.2010, 22:56 2
1. Food *Juice, *Wodka;
дело в том, что если не поставить *, то получается объект, а не указатель
2. не виртуальный, а абстрактный, во всяком случае я не слышал про виртуальные классы
3. Vodka

..ну и конструктор у потомка не объявлен
1
98 / 94 / 16
Регистрация: 16.05.2010
Сообщений: 310
28.08.2010, 23:00 3
А также не плохо бы предусмотреть пустой конструктор для Food
1
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
28.08.2010, 23:35 4
Сдесь че-то не заметил виртуальные классы. Только функции.
Цитата Сообщение от alex_x_x Посмотреть сообщение
во всяком случае я не слышал про виртуальные классы
Я тоже до какого-то момента не слышал.
0
15 / 15 / 2
Регистрация: 24.08.2010
Сообщений: 94
28.08.2010, 23:40  [ТС] 5
Спасибо за ответы. У меня еще одна "странность" - после добавления перед main:
typedef map <string, Food*> MyList;
Ошибок нет но выдает 77 предупреждений, естественно #include <map> есть
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
28.08.2010, 23:41 6
1) Объявлять переменные подобным образом
C++
1
Food *Juice, Wodka;
признак плохого стиля( ИМХО ))) ). Ну и не распространяется звездочка на весь список пременных, а только на рядом стоящую.
2) Деструктор у Food должен быть виртуальным, иначе будет утечка при освобождении памяти через указатель на базовый класс.
1
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
28.08.2010, 23:45 7
Цитата Сообщение от Евгений М. Посмотреть сообщение
Я тоже до какого-то момента не слышал.
и что же это?

Цитата Сообщение от rangerx Посмотреть сообщение
2) Деструктор у Food должен быть виртуальным, иначе будет утечка при освобождении памяти через указатель на базовый класс.
правильно, но тут и ресурсов то нет


Цитата Сообщение от Chainyk Посмотреть сообщение
Ошибок нет но выдает 77 предупреждений
каких? у меня ничего не выдает
0
15 / 15 / 2
Регистрация: 24.08.2010
Сообщений: 94
28.08.2010, 23:55  [ТС] 8
Цитата Сообщение от alex_x_x Посмотреть сообщение
каких? у меня ничего не выдает
А строка using namespace std у Вас есть? Если я ее убираю тогда предупреждений нет, но стрінг в параметрах не понимает
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
28.08.2010, 23:58 9
напишите код и ошибки, иначе не понять
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
29.08.2010, 00:00 10
Цитата Сообщение от Евгений М. Посмотреть сообщение
Я тоже до какого-то момента не слышал.
Виртуальные методы, виртуальное наследование помню... Виртуальные классы не помню О_о
0
15 / 15 / 2
Регистрация: 24.08.2010
Сообщений: 94
29.08.2010, 00:15  [ТС] 11
Цитата Сообщение от alex_x_x Посмотреть сообщение
напишите код и ошибки, иначе не понять
Вот такой сейчас код целиком:
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
#include <string>
#include <iostream>
#include <map>
 
using namespace std;
 
//Basic class
class Food      
{
public:
    Food ();
    Food (int m) {Weight = m;};
    virtual ~Food();
    Food& operator= (Food& rhs);
    virtual int GetWeight() = 0;
protected:
    int Weight;
};
 
//Child class
class Drink:public Food
{
public:
    Drink ();
    Drink (int v);
    virtual ~Drink ();
    virtual int GetWeight () {return Weight;};
private:
    int Capacity;
};
 
//Child class
class Fruits:public Food
{
public:
    Fruits ();
    Fruits (int n);
    virtual ~Fruits ();
    virtual int GetWeight () {return Weight;};
private:
    int Number;
};
 
//Drink constructor
Drink::Drink (int v):Food(v)
{
    Capacity = v;
};
 
//Fruits constructor
Fruits::Fruits (int n):Food(n*150)
{
    Number = n;
};
 
//Food operator =
Food& Food::operator= (Food& rhs)
{
    if (&rhs == this)
        return *this;
    Weight = rhs.GetWeight;
    return *this;
};
 
typedef map <string, Food*> MyList;
 
int main ()
{
    Food *Juice, *Apple;
    MyList List;
    Juice = new Drink (500);
    Apple = new Fruits (4);
    return 0;
}
Я хочу создать контейнер с указателями на базовый абстрактный класс
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
29.08.2010, 00:26 12
Цитата Сообщение от Chainyk Посмотреть сообщение
Food* Food::operator= (Food* rhs)
{
if (rhs == this)
return this;
Weight = rhs->GetWeight;
return this;
};
GetWeight() - метод, нужны скобки.
А почему вы не пользуетесь ссылками, вместо указателей?

Также не нашел реализации конструкторов по умолчанию у всех классов.
1
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
29.08.2010, 00:29 13
Цитата Сообщение от fasked Посмотреть сообщение
Также не нашел реализации конструкторов по умолчанию у всех классов.
и деструкторов, если чтото объявляете, то надо и описывать, иначе будут ошибки линковки
1
15 / 15 / 2
Регистрация: 24.08.2010
Сообщений: 94
29.08.2010, 00:41  [ТС] 14
Цитата Сообщение от fasked Посмотреть сообщение
GetWeight() - метод, нужны скобки.
Переучился Нужно ложиться спать...
Спаибо, все переделал:
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
93
94
#include <string>
#include <iostream>
#include <map>
 
using namespace std;
 
//Basic class
class Food      
{
public:
    Food ();
    Food (int m) {Weight = m;};
    virtual ~Food();
    Food& operator= (Food& rhs);
    virtual int GetWeight() = 0;
protected:
    int Weight;
};
 
//Child class
class Drink:public Food
{
public:
    Drink ();
    Drink (int v);
    virtual ~Drink ();
    virtual int GetWeight () {return Weight;};
private:
    int Capacity;
};
 
//Child class
class Fruits:public Food
{
public:
    Fruits ();
    Fruits (int n);
    virtual ~Fruits ();
    virtual int GetWeight () {return Weight;};
private:
    int Number;
};
 
//Constructors
Food::Food ()
{};
 
Drink::Drink ()
{};
 
Fruits::Fruits ()
{};
 
//Destructors
Food::~Food ()
{};
 
Drink::~Drink ()
{};
 
Fruits::~Fruits ()
{};
 
//Drink constructor
Drink::Drink (int v):Food(v)
{
    Capacity = v;
};
 
//Fruits constructor
Fruits::Fruits (int n):Food(n*150)
{
    Number = n;
};
 
//Food operator =
Food& Food::operator= (Food& rhs)
{
    if (&rhs == this)
        return *this;
    Weight = rhs.GetWeight ();
    return *this;
};
 
typedef map <string, Food*> MyList;
 
int main ()
{
    Food *Juice, *Apple;
    MyList List;
    Juice = new Drink (500);
    Apple = new Fruits (4);
    return 0;
}
Но 77 предупреждений остались
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
29.08.2010, 00:44 15
какой компилятор и какие предупреждения, ни gcc с полным набором опций, ни VS ничего не выдают
(gcc правда говорил о лишних ; ))))
0
Евгений М.
29.08.2010, 00:46
  #16

Не по теме:

Цитата Сообщение от alex_x_x Посмотреть сообщение
и что же это?
Я ошибся, правильнее сказать виртуальный базовый класс.
В книге Страуструпа (3-ее издание) есть такая вещь (Virtual Base Classes). Судя по написанному это и есть виртуальное наследование.

1
alex_x_x
29.08.2010, 00:49
  #17

Не по теме:

Евгений М., те виртуальный, но не абстрактный?

0
15 / 15 / 2
Регистрация: 24.08.2010
Сообщений: 94
29.08.2010, 00:51  [ТС] 18
Цитата Сообщение от alex_x_x Посмотреть сообщение
какой компилятор и какие предупреждения, ни gcc с полным набором опций, ни VS ничего не выдают
(gcc правда говорил о лишних ; ))))
Компилятор VS 6.0. Вот предупреждения (при нажатии F4 показывает файлы с описанием и декларациями):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Compiling...
main.cpp
c:\program files\microsoft visual studio\vc98\include\xtree(120) : warning C4786: 'std::_Tree<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,
Food *>,std::map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,Food *,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<Food *> >::_Kfn,std::less<std::basic_string<char,std::char_t
raits<char>,std::allocator<char> > >,std::allocator<Food *> >' : identifier was truncated to '255' characters in the debug information
        c:\program files\microsoft visual studio\vc98\include\map(46) : see reference to class template instantiation 'std::_Tree<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::pair<std::basic_string<char,std::char_traits<
char>,std::allocator<char> > const ,Food *>,std::map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,Food *,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<Food *> >::_Kfn,std::les
s<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<Food *> >' being compiled
       ...
warning C4786: 'std::_Tree<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,Food *>,std::map<std::basic_string<char,std::char_traits<char>,std:
:allocator<char> >,Food *,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<Food *> >::_Kfn,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<Food *> >::_Red
bl' : identifier was truncated to '255' characters in the debug information
Linking...
 
Study.exe - 0 error(s), 77 warning(s)
Видимо стринг в параметрах не нравиться
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
29.08.2010, 00:54 19
дремучий у вас компилятор, после раскрытия полного имени через шаблоны map <string, Food*> и ему подобные не влезают в 255 символов, не знаю, с VC6 не работаю
0
Евгений М.
29.08.2010, 00:54     Указатель на виртуальный класс
  #20

Не по теме:

Цитата Сообщение от alex_x_x Посмотреть сообщение
но не абстрактный?
Если я понял вопрос, то не обязательно.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.08.2010, 00:54

Виртуальный базовый класс
Создать иерархию типов, описывающую - человека, студента, отца семейства и студента-отца семейства....

Базовый виртуальный класс
Подскажите пожалуйста зачем нужен базовый виртуальный класс, если я могу в наследники описать все...

Виртуальный класс. Сигналы
#ifndef MODULE_H #define MODULE_H #include &lt;QWidget&gt; class Module : public QWidget { ...

Как преобразовать указатель на класс к указателю на асбтрактный класс?
Но тут есть одна тонкость- два промежуточных класса. Вот код, надеюсь всё из него понятно....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru