|
Доступ к методам (функциям) класса., Выбор оптимального способа |
|
|
|
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 15 2008, 09:39
|
Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233

|
Вставлю и я свои 5 копеек  1. Если у Вас TOne - таки LCD, то можно использовать статические функции. Ведь LCD у вас в системе один, правильно? Код class TOne { static int memberVar; public: static void Foo() {} }; ..... class TTwo { public: void Bar() { TOne::Foo(); } }; 2. Если TOne - не LCD (или у вас в системе их несколько  ), тогда правильнее передавать указатель на TOne в ф-цию ининциализации Код class TOne { public: void Foo() {} }; ..... class TTwo { TOne* oneInstance; public: void Init(TOne* one) { oneInstance = one; }
void Bar() { oneInstance->Foo(); } }; ... TOne mOne; TTwo mTwo;
int main(int, char**) { mTwo.Init(&mOne); mTwo.Bar(); .... } А friend тут не причем. У человека, по-моему, проблемы не с правами доступа к членам класса, а с доступом (работой) к глобальным переменным.
|
|
|
|
|
Oct 15 2008, 11:18
|

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

|
Чтобы не было "гаданий на кофейной гуще" опишу коротко "историю" возникновения вопроса... Хоть с темой это и не связано. - была рабочая программа на Си. Программа содержала готовые "блоки" для работы с LCD, интерфейсы I2C, SPI, UART, работа с кнопками, энкодером и т.д; - при "проектировании" нового изделия было принято решение о переходе на С++ (причины принятия решения опускаю); - мне показалось достаточным "обозвать" (объявить) блоки классами. Для доступности функций интерфейса (LCD и т.д.) и проводилось прямое, читай - бездумное, наследование. - пока объема озу (стека) хватало для размещения всех копий базовых классов все было "спокойно"... А как только порог был превышен, так сразу и появился, вопрос, вынесенный в топик. Поэтому подтекст вопроса примерно такой: "Как можно обратиться к функции, объявленной в другом классе (члену другото класса - так правильнее  ), без "потери" памяти на это обращение". Но в таком виде писать вопрос в TOP стыдно .. (видимо напрасно стыжусь - учиться никогда не поздно). И friend и static весьма "полезны": friend позволяет получить доступ без создания копий (т.е. буквально то, что я хотел), а обявление элемента с квалификатором static гарантирует, что будет создана только одна копия этого элемента. (Пишу очевидные вещи для таких как я начинающих С++). Еще раз спасибо. "...Чем лучше программист знает С, тем труднее будет для него при программировании на С++ отойти от стиля программирования на С...." (с) Бьерн Страуструп. .... А чем наследование лучше/хуже доступа через friend? (для рассматриваемого случая)
|
|
|
|
|
Nov 6 2008, 12:45
|
Местный
  
Группа: Свой
Сообщений: 320
Регистрация: 13-09-06
Пользователь №: 20 348

|
Цитата(Stas633 @ Oct 15 2008, 14:18)  Чтобы не было "гаданий на кофейной гуще" опишу коротко "историю" возникновения вопроса... Хоть с темой это и не связано. - была рабочая программа на Си. Программа содержала готовые "блоки" для работы с LCD, интерфейсы I2C, SPI, UART, работа с кнопками, энкодером и т.д; ... И friend и static весьма "полезны": friend позволяет получить доступ без создания копий (т.е. буквально то, что я хотел), а обявление элемента с квалификатором static гарантирует, что будет создана только одна копия этого элемента. (Пишу очевидные вещи для таких как я начинающих С++). В таких случаях как приведен выше использую класс со всеми методами объявленными как static (в C# почти что все библиотечные функции статические методы класса). С friend-м надо лучше концепцию продумать. Цитата(Stas633 @ Oct 15 2008, 14:18)  .... А чем наследование лучше/хуже доступа через friend? (для рассматриваемого случая) Наследование хорошо использовать но, надо заметить, что возможно два основных случая: -замещение; -виртуальность. Использование виртуальности ведет к повышенному расходу памяти (создание v-таблицы) и снижение производительности
|
|
|
|
|
Nov 7 2008, 07:25
|

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

|
Цитата(bookevg @ Nov 6 2008, 15:45)  ... Спасибо. Согласен... Наследование для решения вопроса доступа - это, как минимум, не экономно. ... Если говорить по теме, то вопрос доступа решил так, как рекомендовал dxp. А именно: - каждый объект "размещен" в своей "единице компиляции" (ЕдКомп) /связка файлов, например, One.h и One.cpp/ ( так делал и раньше); - член класса / TOne mTOne;/ объявляется теперь в TOne.cpp, а не в main.cpp как раньше; - а для возможности использования функций (свойств) TOne, там где нужно, mTOne объявляется с квалификатором extern. ... файл One.hКод ... class TOne { ... public: void FuncOne(void); ... } ... файл One.cppКод ... TOne mTOne; .... void FuncOne(void) { } ... файл Two.hКод ... class TTwo { ... public: void FuncTwo(void); ... } ... файл Two.cppКод .... #include "One.h"
TTwo mTTwo; extern TOne mTOne; .... void FuncTwo(void) { ... mTOne.FuncOne(); ... } На мой взгляд, наиболее простой и понятный способ. А если говорить не совсем по теме, то главная проблема ("разруха" в первоисточнике) "...в головах, а не в клозетах..." (с) Нельзя заниматься ООП оперируя процедурами. Как только приходишь к пониманию "объекта", так все очень упрощается. И "создание" (представление) модели программы, и понимание взаимоотношений между разными частями этой программы. Не буду пересказывать написанное Гради Бучем (и про мыслительный процесс человека в повседневной жизни, и про количество абстракций, с которыми человек способен работать одновременно, и т.д.), но, на мой взгляд, достаточно прочесть главу " 1.2. Структура сложных систем" и вопросов о полезности и естественности перехода к ООП не остается. Мир вокруг нас состоит из Объектов, а не из Процедур. И живем мы, используя Объекты и их какие-то свойсва (Процедуры), а не Процедуры каких-то Объектов.
|
|
|
|
Сообщений в этой теме
Stas633 Доступ к методам (функциям) класса. Oct 13 2008, 21:44 igorenja Цитата(Stas633 @ Oct 14 2008, 03:44)
Я ... Oct 14 2008, 05:19 dxp Цитата(Stas633 @ Oct 14 2008, 04:44) Что ... Oct 14 2008, 08:12 Stas633 Ув. dxp, спасибо за Ваши советы/рекомендации (в др... Oct 14 2008, 20:58  dxp Цитата(Stas633 @ Oct 15 2008, 03:58) Что ... Oct 15 2008, 04:32   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    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
|
|
|