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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
Chainyk
 Аватар для Chainyk
15 / 15 / 1
Регистрация: 24.08.2010
Сообщений: 94
#1

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

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

Например у меня есть виртуальный класс 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2010, 22:49     Указатель на виртуальный класс
Посмотрите здесь:

C++ Виртуальный базовый класс
Виртуальный методы, абстрактный класс. C++
C++ Виртуальный класс и перегрузка оператора
Как преобразовать указатель на класс к указателю на асбтрактный класс? C++
Виртуальный метод с параметром типа класс C++
Класс работник. Виртуальный метод C++
C++ Абстрактный класс. Виртуальный метод, который возвращает T- тип
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
28.08.2010, 22:56     Указатель на виртуальный класс #2
1. Food *Juice, *Wodka;
дело в том, что если не поставить *, то получается объект, а не указатель
2. не виртуальный, а абстрактный, во всяком случае я не слышал про виртуальные классы
3. Vodka

..ну и конструктор у потомка не объявлен
IchMors
97 / 93 / 4
Регистрация: 16.05.2010
Сообщений: 310
28.08.2010, 23:00     Указатель на виртуальный класс #3
А также не плохо бы предусмотреть пустой конструктор для Food
Евгений М.
1034 / 975 / 53
Регистрация: 28.02.2010
Сообщений: 2,819
Завершенные тесты: 2
28.08.2010, 23:35     Указатель на виртуальный класс #4
Сдесь че-то не заметил виртуальные классы. Только функции.
Цитата Сообщение от alex_x_x Посмотреть сообщение
во всяком случае я не слышал про виртуальные классы
Я тоже до какого-то момента не слышал.
Chainyk
 Аватар для Chainyk
15 / 15 / 1
Регистрация: 24.08.2010
Сообщений: 94
28.08.2010, 23:40  [ТС]     Указатель на виртуальный класс #5
Спасибо за ответы. У меня еще одна "странность" - после добавления перед main:
typedef map <string, Food*> MyList;
Ошибок нет но выдает 77 предупреждений, естественно #include <map> есть
rangerx
1921 / 1530 / 139
Регистрация: 31.05.2009
Сообщений: 2,892
28.08.2010, 23:41     Указатель на виртуальный класс #6
1) Объявлять переменные подобным образом
C++
1
Food *Juice, Wodka;
признак плохого стиля( ИМХО ))) ). Ну и не распространяется звездочка на весь список пременных, а только на рядом стоящую.
2) Деструктор у Food должен быть виртуальным, иначе будет утечка при освобождении памяти через указатель на базовый класс.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
28.08.2010, 23:45     Указатель на виртуальный класс #7
Цитата Сообщение от Евгений М. Посмотреть сообщение
Я тоже до какого-то момента не слышал.
и что же это?

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


Цитата Сообщение от Chainyk Посмотреть сообщение
Ошибок нет но выдает 77 предупреждений
каких? у меня ничего не выдает
Chainyk
 Аватар для Chainyk
15 / 15 / 1
Регистрация: 24.08.2010
Сообщений: 94
28.08.2010, 23:55  [ТС]     Указатель на виртуальный класс #8
Цитата Сообщение от alex_x_x Посмотреть сообщение
каких? у меня ничего не выдает
А строка using namespace std у Вас есть? Если я ее убираю тогда предупреждений нет, но стрінг в параметрах не понимает
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
28.08.2010, 23:58     Указатель на виртуальный класс #9
напишите код и ошибки, иначе не понять
fasked
Эксперт C++
 Аватар для fasked
4929 / 2509 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
29.08.2010, 00:00     Указатель на виртуальный класс #10
Цитата Сообщение от Евгений М. Посмотреть сообщение
Я тоже до какого-то момента не слышал.
Виртуальные методы, виртуальное наследование помню... Виртуальные классы не помню О_о
Chainyk
 Аватар для Chainyk
15 / 15 / 1
Регистрация: 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;
}
Я хочу создать контейнер с указателями на базовый абстрактный класс
fasked
Эксперт C++
 Аватар для fasked
4929 / 2509 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
29.08.2010, 00:26     Указатель на виртуальный класс #12
Цитата Сообщение от Chainyk Посмотреть сообщение
Food* Food::operator= (Food* rhs)
{
if (rhs == this)
return this;
Weight = rhs->GetWeight;
return this;
};
GetWeight() - метод, нужны скобки.
А почему вы не пользуетесь ссылками, вместо указателей?

Также не нашел реализации конструкторов по умолчанию у всех классов.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
29.08.2010, 00:29     Указатель на виртуальный класс #13
Цитата Сообщение от fasked Посмотреть сообщение
Также не нашел реализации конструкторов по умолчанию у всех классов.
и деструкторов, если чтото объявляете, то надо и описывать, иначе будут ошибки линковки
Chainyk
 Аватар для Chainyk
15 / 15 / 1
Регистрация: 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 предупреждений остались
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
29.08.2010, 00:44     Указатель на виртуальный класс #15
какой компилятор и какие предупреждения, ни gcc с полным набором опций, ни VS ничего не выдают
(gcc правда говорил о лишних ; ))))
Евгений М.
29.08.2010, 00:46
  #16

Не по теме:

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

alex_x_x
29.08.2010, 00:49
  #17

Не по теме:

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

Chainyk
 Аватар для Chainyk
15 / 15 / 1
Регистрация: 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)
Видимо стринг в параметрах не нравиться
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
29.08.2010, 00:54     Указатель на виртуальный класс #19
дремучий у вас компилятор, после раскрытия полного имени через шаблоны map <string, Food*> и ему подобные не влезают в 255 символов, не знаю, с VC6 не работаю
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2010, 00:54     Указатель на виртуальный класс
Еще ссылки по теме:

C++ Копирование списка указателей на виртуальный класс
C++ Виртуальный класс. Сигналы
Абстрактный класс «Клиент банка», имеющий виртуальный метод для вывода данных о клиенте C++
C++ Указатель на указатель, класс группа
Виртуальный абстрактный класс C++

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

Или воспользуйтесь поиском по форуму:
Евгений М.
29.08.2010, 00:54     Указатель на виртуальный класс
  #20

Не по теме:

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

Yandex
Объявления
29.08.2010, 00:54     Указатель на виртуальный класс
Ответ Создать тему
Опции темы

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