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

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

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

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

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

виртуальный табличный указатель - C++
виртуальным табличным указателем vptr (указатель на таблицу виртуальных методов класса, которому принадлежит объект) является указатель p...

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

Указатель на указатель, класс группа - C++
помогите пожалуйста не могу понять что со строкой 312 знаю что с указателем что то не то... но исправить не получается //4. В...

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
28.08.2010, 22:56 #2
1. Food *Juice, *Wodka;
дело в том, что если не поставить *, то получается объект, а не указатель
2. не виртуальный, а абстрактный, во всяком случае я не слышал про виртуальные классы
3. Vodka

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

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


Цитата Сообщение от Chainyk Посмотреть сообщение
Ошибок нет но выдает 77 предупреждений
каких? у меня ничего не выдает
0
Chainyk
15 / 15 / 1
Регистрация: 24.08.2010
Сообщений: 94
28.08.2010, 23:55  [ТС] #8
Цитата Сообщение от alex_x_x Посмотреть сообщение
каких? у меня ничего не выдает
А строка using namespace std у Вас есть? Если я ее убираю тогда предупреждений нет, но стрінг в параметрах не понимает
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
28.08.2010, 23:58 #9
напишите код и ошибки, иначе не понять
0
fasked
Эксперт С++
4937 / 2517 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
29.08.2010, 00:00 #10
Цитата Сообщение от Евгений М. Посмотреть сообщение
Я тоже до какого-то момента не слышал.
Виртуальные методы, виртуальное наследование помню... Виртуальные классы не помню О_о
0
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;
}
Я хочу создать контейнер с указателями на базовый абстрактный класс
0
fasked
Эксперт С++
4937 / 2517 / 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() - метод, нужны скобки.
А почему вы не пользуетесь ссылками, вместо указателей?

Также не нашел реализации конструкторов по умолчанию у всех классов.
1
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
29.08.2010, 00:29 #13
Цитата Сообщение от fasked Посмотреть сообщение
Также не нашел реализации конструкторов по умолчанию у всех классов.
и деструкторов, если чтото объявляете, то надо и описывать, иначе будут ошибки линковки
1
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 предупреждений остались
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
29.08.2010, 00:44 #15
какой компилятор и какие предупреждения, ни gcc с полным набором опций, ни VS ничего не выдают
(gcc правда говорил о лишних ; ))))
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2010, 00:44
Привет! Вот еще темы с ответами:

Как преобразовать указатель на класс к указателю на асбтрактный класс? - C++
Но тут есть одна тонкость- два промежуточных класса. Вот код, надеюсь всё из него понятно. #include &lt;stdio.h&gt; ...

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

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

Виртуальный методы, абстрактный класс. - C++
Здравствуйте. Теоретические вопросы. Что такое виртуальный методы и что такое абстрактный класс. Можете объяснить своими словами без...


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

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

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