|
Доступ к методам (функциям) класса., Выбор оптимального способа |
|
|
|
Oct 13 2008, 21:44
|

Частый гость
 
Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901

|
Допустим: - имеются два класса TOne и TTwo; - в TOne определена ф-ция FuncOne(); - классы определены в разных единицах компиляции (файлах); - созданы объекты (глобальные) этих классов (mOne и mTwo) в третьем файле - "main.cpp". Вопрос: Как из класса TTwo получить доступ (использовать) функцию FuncOne() класса TOne? 1. наследовать TOne в TTwo 2. перед описанием класса TTwo объявить объект классаа TOne: extern TOne mOne. 3. ...? ... А если таких "вложений" больше? (Т.е. функции TTwo, использующие TOne, необходимы в TThree) Что лучше? Как правильнее? Есть ли разница в испозовании стека? Прим. Например: TOne - класс описывающий работу с индикатором (LCD), а TTwo - класс формирования данных для вывода на индикатор. Рассматривается ситуация одного процесса (не RTOS). Прим.1 Вопрос задаю здесь, так как обсуждение темы о выделении раздела форума для "чистого" программирования, увы, ни к чему не привело.  Господа Админы/Модераторы извините, просмотрел..
|
|
|
|
|
 |
Ответов
|
Oct 14 2008, 08:12
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(Stas633 @ Oct 14 2008, 04:44)  Что лучше? Как правильнее? Есть ли разница в испозовании стека?
Прим. Например: TOne - класс описывающий работу с индикатором (LCD), а TTwo - класс формирования данных для вывода на индикатор. Рассматривается ситуация одного процесса (не RTOS). Что лучше и правильнее, зависит от задачи. Если один класс является другим + некоторые свои расширения, то имеет смысл наследовать, если один класс содержит функциональность другого, то имеет смысл включить один в другой. Если классы живут сами по себе, то ничего вышесказанного делать не нужно, а общение меж ними организовать на открытой части (public). Для того, чтобы сделать объект глобальным (не важно, какой объект - класса или встроенного типа), нужно объявить объект в одном из исходных файлов, а в одном из заголовочных, который включается во все исходные, объявить этот же объект с квалификатором extern. Тогда объект будет виден и доступен везде, где есть это объявление.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Oct 14 2008, 20:58
|

Частый гость
 
Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901

|
Ув. dxp, спасибо за Ваши советы/рекомендации (в другой ветке)!!! ... При внешней схожести С и С++ очень разные языки... ...разные тем, что на них думать надо совсем по-разному... ... Попробуйте думать над программой на уровне объектов реального мира, ..., тогда реализация ляжет на классы почти сама собой... (с) dxpНачал ознакомление с работами Страуструпа и Буча ("настольной книгой", до последнего времени, был "Самоучитель..." Шилдта) и сразу понял, что, используя синтаксис и правила С++, пишу на Си! Отсюда и "проблемы" вида: ".. как сделать функцию доступной.." и т.д. При написании программы я использовал "прямое" наследование для получения доступа к функциям базовых классов. Т.е. при создании объекта производного класса создавался объект/копия базового класса и таких копий было "множество", хотя достаточно одной единственной. Последствия, в виде "нехватки" ОЗУ, очевидны... Отсюда и мой интерес к получению "беззатратного" доступа к "чужим" функциям. Программу нужно писать на С++, а не на Си, изпользуя С++ синтатсис и правила!!  Т.е. начинать нужно с рисования структуры связей и т.д. Спасибо еще раз! Цитата(dxp @ Oct 14 2008, 12:12)  ... Если классы живут сами по себе, то ничего вышесказанного делать не нужно, а общение меж ними организовать на открытой части (public).... Что Вы имеете ввиду? Если не через наследование, то как тогда?
|
|
|
|
|
Oct 15 2008, 04:32
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(Stas633 @ Oct 15 2008, 03:58)  Что Вы имеете ввиду? Если не через наследование, то как тогда? Не очень понимаю затруднение. Вот имеем код: Код class TSlon { public: TSlon(); void f(); };
class TMamont { public: TMamont(); void f(); }; ...
TSlon slon; TMamont mamont;
void TMamont::f() { slon.f(); } как видно, спокойно вызываем из функции одного класса функцию другого. Все public члены классов доступны внешнему окружению без каких-либо ограничений. Это так задумано, и это логично. Управление доступом - основа инкапсуляции/абстракции. Представление прячем в private секцию объекта, а общение (функциональность) делаем через интерфейс - public секцию. Как правило, в public секции присутствуют только функции. Т.е. интерфейс - это действия, которые может выполнять объект, а доступ к данным снаружи как правило не нужен и чреват хаками и ошибками. Хотя, конечно, язык не запрещает делать открытыми и данные-члены. В некоторых случаях возникает необходимость дать доступ к закрытой части одного класса другому классу, но при это не хочется делать эту часть открытой, чтобы к ней не было доступа всем. В этом случае можно объявить класс, который нуждается в доступе, как friend (друг) в классе, к представлению которого требуется доступ. Или вам что-то другое надо?
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
Сообщений в этой теме
Stas633 Доступ к методам (функциям) класса. Oct 13 2008, 21:44 igorenja Цитата(Stas633 @ Oct 14 2008, 03:44)
Я ... Oct 14 2008, 05:19   Stas633 Цитата(dxp @ Oct 15 2008, 08:32) Или вам ... Oct 15 2008, 08:09    dxp Цитата(Stas633 @ Oct 15 2008, 15:09) В пр... Oct 15 2008, 11:59     Stas633 Цитата(dxp @ Oct 15 2008, 15:59) Словом, ... Oct 15 2008, 12:22     IgorKossak Цитата(dxp @ Oct 15 2008, 14:59) Почему н... Oct 15 2008, 16:10     ?ELF Цитата(dxp @ Oct 15 2008, 17:59) ...
...
... Oct 17 2008, 20:18 alexander55 Цитата(Stas633 @ Oct 14 2008, 01:44)
Ту... Oct 15 2008, 05:19 IgorKossak Цитата(Stas633 @ Oct 14 2008, 00:44) Вопр... Oct 15 2008, 08:38 vik0 Вставлю и я свои 5 копеек
1. Если у Вас TOne - та... Oct 15 2008, 09:39 Stas633 Чтобы не было "гаданий на кофейной гуще... Oct 15 2008, 11:18  bookevg Цитата(Stas633 @ Oct 15 2008, 14:18) Чтоб... Nov 6 2008, 12:45   Stas633 Цитата(bookevg @ Nov 6 2008, 15:45) ...
С... Nov 7 2008, 07:25    Stas633 Поиск "оптимального" решения продолжаетс... Nov 21 2008, 20:03     bookevg Цитата(Stas633 @ Nov 21 2008, 23:03) Поис... Nov 22 2008, 08:28      Stas633 Цитата(bookevg @ Nov 22 2008, 11:28) Я та... Nov 22 2008, 10:09       bookevg Цитата(Stas633 @ Nov 22 2008, 13:09) Сове... Nov 24 2008, 13:51        Stas633 Ув. bookevg, Вы, безусловно, во многом правы! ... Nov 24 2008, 22:08
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|