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

Возможное распределение памяти - C++

Восстановить пароль Регистрация
 
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
23.04.2013, 09:36     Возможное распределение памяти #1
Здорова!
Есть задачка:
Изобразите возможное распределение памяти для класса Radio из параграфа 15.2.3.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
//racpredelenie pam9ti dl9 Radio
#include <iostream>
using std::cout;
using std::endl;
 
class Storable
{
public:
    virtual const char* get_file()=0;
    virtual void read()=0;
    virtual void write()=0;
    virtual ~Storable(){}
};
 
class Transmitter : public Storable
{
public:
    void write();
    //...
};
 
class Receiver : public Storable
{
public:
    void write();
    //...
};
 
class Radio : public Transmitter, public Receiver
{
public:
    const char* get_file();
    void read();
    void write();
    //...
};
 
void Radio::write()
{
    Transmitter::write();
    Receive::write();
    //dalee piwem informaciyu, cpecufichnyyu dl9 Radio
}
 
int main()
{
    
    
    return 0;
}
Я чото не пойму как ее делать. Что имеется введу под "Изобразите возможное распределение памяти" ?

И под этим что имеется в веду "Объясните как можно реализовать вызов виртуальной функции."?
Похоже функцию Sorable::write() наверно. Но а как же мы ее вызовем, если она чисто виртуальная?

Добавлено через 9 часов 47 минут
Тут походу в задаче это реплицируемые базовые классы, то есть в классе Radio находится две копии самого верхнего базового класса Storable?

А как же нам вызов виртуальной функции реализовать?
Походу должен быть указатель на Storable например Storable* S; Ну и как вызвать виртуальную функцию через указатель? На какой класс указатель мы должны присвоить S? Если мы указатель на Radio* присвоим S и вызовем S->write(), то будет неоднозначность правильнож? Ведь в Radio как бы хрониться два объекта класса базового класса Storable?

Походу задачку устно нужно решать, ну и можно подкрепить чо нить кодом.

Как с этим разберемся потом еще рассмотрим механизм "виртуального базового класса", потом так для примера.

Ладно я так смотрю тут походу нужно хорошо тестить, чтобы разобраться, а так фиг что поймешь.

Добавлено через 10 минут
От пытаюсь еще создать объекты классов:
C++
1
2
Transmitter T;
    Receiver Re;
Выдает ошибку типо они виртуальные классы, но как это так? ведь виртуальный класс это класс у которого есть чисто виртуальная функция. Да ок. Значит, что можно сделать предположение, что так как в классах Transmitter Receiver не были переопределены функции которые виртуальные в Storable, то они просто перенеслись в них и они стали виртуальными или как это понимать? Попытаться переопределить их и затем вызвать? Ок щас попробую.

Да все таки не ошибся оказывется если не замещаем функции, то производный класс автоматически становится виртуальным.

А зачем еще в Storable виртуальный деструктор создается?

Добавлено через 47 минут
Ладно с виртуальным деструктором разобрался, так всетаки какуюж виртуалльную функцию имели в веду write() или read() ?

Добавлено через 2 минуты
Чо то мне кажется, что нельзя ни одной вызвать.
C++
1
2
Radio R;
    Storable* S=&R;
Вот отетот код выдает ошибку типо Storable является неоднозначной базой для Radio. Значит можно токо вызвать виртуальные функции для каждого класса из двоих. Щас попробую.

Добавлено через 5 минут
я думаю утето от решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Radio R;
    //Storable* S=&R;//owibka nel6z9 tak kak neodnoznachnoct6 dva ob6ekta
    
    //mojno cherez bazy Transmitter.
    Transmitter* T=&R;
    T->write();
    T->read();
    
    cout <<endl<<endl;
    //mojno cherez bazy Receiver
    Receiver* Re=&R;
    Re->write();
    Re->read();
можно токо так.
Ладно я тут вижу народ не в теме, значит механизм виртуального базового класса рассматривать не будем.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2013, 09:36     Возможное распределение памяти
Посмотрите здесь:

C++ Динамическое распределение памяти
C++ Распределение памяти
C++ Динамическое распределение памяти
C++ распределение памяти
Распределение памяти C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
23.04.2013, 09:46     Возможное распределение памяти #2
ninja2, Поговорили сами с собой? Что ж, бывает полезно. Но я вот так и не понял в чем вопрос. Вы не могли бы писать попонятнее? Кол-во ошибок зашкаливает, просто нереально читать. Вместо того, чтобы вываливать стену текста на форум - лучше сформулируйте четко, без ошибок и понятно вопрос.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
23.04.2013, 09:53  [ТС]     Возможное распределение памяти #3
Цитата Сообщение от ForEveR Посмотреть сообщение
ninja2, Поговорили сами с собой? Что ж, бывает полезно. Но я вот так и не понял в чем вопрос. Вы не могли бы писать попонятнее? Кол-во ошибок зашкаливает, просто нереально читать. Вместо того, чтобы вываливать стену текста на форум - лучше сформулируйте четко, без ошибок и понятно вопрос.
Ок.
Вопрос, то не сильно понятный мне. Вопрос это само условие задачи в верху и код с параграфа под условием.
А то что ниже, то я как бы пытался ее разобрать, а мб и кого то натолкнуть на идею как ее решать (форумчан). Я просто слабо разбираюсь в этом поэтому там и не понятно, что я имел введу.

А с собой поговорить прикольно. (мозговой штурм с собой )

Ну я вообщем разобрался. Запутанная задачка.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
23.04.2013, 09:53     Возможное распределение памяти #4
Походу должен быть указатель на Storable например Storable* S; Ну и как вызвать виртуальную функцию через указатель? На какой класс указатель мы должны присвоить S? Если мы указатель на Radio* присвоим S и вызовем S->write(), то будет неоднозначность правильнож? Ведь в Radio как бы хрониться два объекта класса базового класса Storable?
Очевидно да. И решается это соответственно элементарно. Кастим к Transmitter или Receiver и получшившийся указатель кастим к Storable.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
23.04.2013, 10:02  [ТС]     Возможное распределение памяти #5
Цитата Сообщение от ForEveR Посмотреть сообщение
Очевидно да. И решается это соответственно элементарно. Кастим к Transmitter или Receiver и получшившийся указатель кастим к Storable.
Ну да отак от:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main()
{
    Radio R;
    Storable* S;//owibka nel6z9 tak kak neodnoznachnoct6 dva ob6ekta
    
    //mojno cherez bazy Transmitter.
    Transmitter* T=&R;
    S=T;//кастим к Storable
    S->write();
    S->read();
    
    cout <<endl<<endl;
    //mojno cherez bazy Receiver
    Receiver* Re=&R;
    S=Re;//кастим к Storable
    S->write();
    S->read();
    
    
    return 0;
}
Ну решается не так, то элементарно, если не шаришь или первый раз решаешь. Щас конечно я б ее по быстрому решил.
Yandex
Объявления
23.04.2013, 10:02     Возможное распределение памяти
Ответ Создать тему
Опции темы

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