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

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

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

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

28.08.2010, 22:49. Просмотров 1754. Ответов 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++
виртуальным табличным указателем vptr (указатель на таблицу виртуальных методов класса, которому принадлежит объект) является указатель p...

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

Виртуальный класс. Сигналы - C++
#ifndef MODULE_H #define MODULE_H #include <QWidget> class Module : public QWidget { Q_OBJECT public: ...

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

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

Класс работник. Виртуальный метод - C++
Здраствуйте! Надо ввести работников с почасовой ЗП и фиксированной ЗП. Написать виртуальный метод для подсчета ЗП( для почасовиков -...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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
Евгений М.
1035 / 976 / 54
Регистрация: 28.02.2010
Сообщений: 2,825
Завершенные тесты: 2
28.08.2010, 23:35     Указатель на виртуальный класс #4
Сдесь че-то не заметил виртуальные классы. Только функции.
Цитата Сообщение от alex_x_x Посмотреть сообщение
во всяком случае я не слышал про виртуальные классы
Я тоже до какого-то момента не слышал.
Chainyk
15 / 15 / 1
Регистрация: 24.08.2010
Сообщений: 94
28.08.2010, 23:40  [ТС]     Указатель на виртуальный класс #5
Спасибо за ответы. У меня еще одна "странность" - после добавления перед main:
typedef map <string, Food*> MyList;
Ошибок нет но выдает 77 предупреждений, естественно #include <map> есть
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,908
28.08.2010, 23:41     Указатель на виртуальный класс #6
1) Объявлять переменные подобным образом
C++
1
Food *Juice, Wodka;
признак плохого стиля( ИМХО ))) ). Ну и не распространяется звездочка на весь список пременных, а только на рядом стоящую.
2) Деструктор у Food должен быть виртуальным, иначе будет утечка при освобождении памяти через указатель на базовый класс.
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
28.08.2010, 23:45     Указатель на виртуальный класс #7
Цитата Сообщение от Евгений М. Посмотреть сообщение
Я тоже до какого-то момента не слышал.
и что же это?

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


Цитата Сообщение от Chainyk Посмотреть сообщение
Ошибок нет но выдает 77 предупреждений
каких? у меня ничего не выдает
Chainyk
15 / 15 / 1
Регистрация: 24.08.2010
Сообщений: 94
28.08.2010, 23:55  [ТС]     Указатель на виртуальный класс #8
Цитата Сообщение от alex_x_x Посмотреть сообщение
каких? у меня ничего не выдает
А строка using namespace std у Вас есть? Если я ее убираю тогда предупреждений нет, но стрінг в параметрах не понимает
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
28.08.2010, 23:58     Указатель на виртуальный класс #9
напишите код и ошибки, иначе не понять
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
29.08.2010, 00:00     Указатель на виртуальный класс #10
Цитата Сообщение от Евгений М. Посмотреть сообщение
Я тоже до какого-то момента не слышал.
Виртуальные методы, виртуальное наследование помню... Виртуальные классы не помню О_о
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
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
29.08.2010, 00:29     Указатель на виртуальный класс #13
Цитата Сообщение от fasked Посмотреть сообщение
Также не нашел реализации конструкторов по умолчанию у всех классов.
и деструкторов, если чтото объявляете, то надо и описывать, иначе будут ошибки линковки
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
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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
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
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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++
Наследую вектор от матрицы: class Matrix { public: ... virtual bool isValidToMult ( const Matrix &amp; ) const; ... } А...

Копирование списка указателей на виртуальный класс - C++
Добрый день! Подскажите, пожалуйста. Имею примерно такой код class Abstract { public: int mAbs;

Абстрактный класс. Виртуальный метод, который возвращает T- тип - C++
Привет! Допустим, есть абстрактный класс, и метод, который возвращает T-тип. class A { public: template &lt;class T&gt; T*...

Абстрактный класс «Клиент банка», имеющий виртуальный метод для вывода данных о клиенте - C++
Создать абстрактный класс «Клиент банка», имеющий поля ФИО и адрес, а также метод, для вывода данные по клиенту. Дочерними классами...


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

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

Не по теме:

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

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

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