реклама на сайте
подробности

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


Частый гость
**

Группа: Свой
Сообщений: 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 Вопрос задаю здесь, так как обсуждение темы о выделении раздела форума для "чистого" программирования, увы, ни к чему не привело. smile.gif Господа Админы/Модераторы извините, просмотрел..
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vik0
сообщение Oct 15 2008, 09:39
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233



Вставлю и я свои 5 копеек smile.gif
1. Если у Вас TOne - таки LCD, то можно использовать статические функции. Ведь LCD у вас в системе один, правильно?
Код
class TOne
{
  static int memberVar;
public:
  static void Foo() {}
};
.....
class TTwo
{
public:
  void Bar()
  {
     TOne::Foo();
  }
};

2. Если TOne - не LCD (или у вас в системе их несколько smile.gif ), тогда правильнее передавать указатель на 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 тут не причем. У человека, по-моему, проблемы не с правами доступа к членам класса, а с доступом (работой) к глобальным переменным.
Go to the top of the page
 
+Quote Post
Stas633
сообщение Oct 15 2008, 11:18
Сообщение #3


Частый гость
**

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



Чтобы не было "гаданий на кофейной гуще" опишу коротко "историю" возникновения вопроса... Хоть с темой это и не связано.
- была рабочая программа на Си. Программа содержала готовые "блоки" для работы с LCD, интерфейсы I2C, SPI, UART, работа с кнопками, энкодером и т.д;
- при "проектировании" нового изделия было принято решение о переходе на С++ (причины принятия решения опускаю);
- мне показалось достаточным "обозвать" (объявить) блоки классами. Для доступности функций интерфейса (LCD и т.д.) и проводилось прямое, читай - бездумное, наследование.
- пока объема озу (стека) хватало для размещения всех копий базовых классов все было "спокойно"... А как только порог был превышен, так сразу и появился, вопрос, вынесенный в топик. Поэтому подтекст вопроса примерно такой: "Как можно обратиться к функции, объявленной в другом классе (члену другото класса - так правильнее smile.gif ), без "потери" памяти на это обращение". Но в таком виде писать вопрос в TOP стыдно .. (видимо напрасно стыжусь - учиться никогда не поздно).

И friend и static весьма "полезны": friend позволяет получить доступ без создания копий (т.е. буквально то, что я хотел), а обявление элемента с квалификатором static гарантирует, что будет создана только одна копия этого элемента. (Пишу очевидные вещи для таких как я начинающих С++).

Еще раз спасибо.

"...Чем лучше программист знает С, тем труднее будет для него при программировании на С++ отойти от
стиля программирования на С...." (с) Бьерн Страуструп.

....
А чем наследование лучше/хуже доступа через friend? (для рассматриваемого случая)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 18:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01386 секунд с 7
ELECTRONIX ©2004-2016