Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2011, 09:15   #1
sich_zp
 
Регистрация: 15.08.2011
Сообщений: 8
По умолчанию Видимость полей и методов

Добрый день!
Возникла такая проблема, может кто подскажет.
Есть класс Application
В нем определены другие классы примерно так:
Код:
Class Application
{
private:
   C_Menu *MainMenu; 
   C_Automat *Automat;

.........

}
где C_Menu и C_Automat - другие классы со своими методами и полями.

Теперь вопрос. Нужно добавить еще один объект класса
C_Event_Log *Log;
Но так, чтобы я мог работать с его методами и полями в объектах MainMenu и Automat. При чем именно передавать данные.
Не желательно делать объект этого класса как глобальный.

Последний раз редактировалось Stilet; 15.08.2011 в 09:24.
sich_zp вне форума Ответить с цитированием
Старый 15.08.2011, 09:40   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Добавить как поле к этим двум или зафрендить.
p51x вне форума Ответить с цитированием
Старый 15.08.2011, 09:43   #3
sich_zp
 
Регистрация: 15.08.2011
Сообщений: 8
По умолчанию

вот можно по поводу "зафрендить" по подробнее. А то я сколько ни читал про это, а так и не понял как это на практике делается
А по поводу "Добавить как поле к этим двум", то так не получится передать данные из одного в другое. Они не буду видны.
sich_zp вне форума Ответить с цитированием
Старый 15.08.2011, 09:59   #4
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Код:
class C_Event_Log {
  // нужные поля и методы
  friend class C_Menu;
  friend class C_Automat;
};
Вот это и называется зафрендить) Теперь классы C_Menu и C_Automat имеют полный доступ к классу C_Event_Log.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 15.08.2011, 10:39   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

У вас явно ошибка проектирования, не френдить надо, а наследовать или включать нужные поля в ваш класс который будет их использовать.
BOBAH13 вне форума Ответить с цитированием
Старый 15.08.2011, 10:45   #6
sich_zp
 
Регистрация: 15.08.2011
Сообщений: 8
По умолчанию

Так... Я запутался... Я "зафрендил", а как теперь обращаться к методам этого объекта?
Код:
Class Application
{
private:
   C_Menu *MainMenu; 
   C_Automat *Automat;

.........

}
Код:
class C_Event_Log {
  friend class C_Menu;
  friend class C_Automat;
..........
  void Add(void);
};
А теперь внутри класса C_Automat как мне обратиться к методу Add(); класса C_Event_Log ?
sich_zp вне форума Ответить с цитированием
Старый 15.08.2011, 11:12   #7
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Как сказал BOBAH13 - тут не нужно ничего "френдить".
У вас есть класс А (C_Event_Log) и еще два класса B (C_Menu) и С (C_Automat), с которыми должен взаимодействовать класс А.
Для реализации взаимодействия есть несколько вариантов:
Если классы B и С семантически находятся в отношениях "является" с классом А, то есть классы B и C и являются классом А, то они они должны быть унаследованы от А, а у A в свою очередь должны быть protected поля, тогда B и C смогут с ними работать. Пример: классы параллелограмм и прямоугольник - прямоугольник является параллелограммом, поэтому может быть унаследован от него.

Второй вариант - классы семантически находятся в отношениях "содержит". То есть классы B и С содержат класс А, в таком случаи, класс А должен быть полем классов B и С, и эти классы будут делегировать классу А свои функции.
Еще один случай отношений "содержит" - если класс А содержит классы B и С, в таком случаи наоборот, класс А делегирует свои функции классам B и C.
Как пример - классы самолет и двигатель. Самолет содержит двигатель и делегирует ему выполнение своих функций.

Третий вариант - если классы не связаны никакими отношениями, то взаимодействие должно происходить через открытые методы, которые в свою очередь должны работать с закрытыми полями.

В общем случаи, все остальное - ошибка проектирования. Есть исключения, которые зависят от специфики архитектуры, но их нужно стараться избегать.
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 15.08.2011, 11:49   #8
sich_zp
 
Регистрация: 15.08.2011
Сообщений: 8
По умолчанию

бррр... наверно я не очень умный, потому что слабо что понял. Особенно слово "семантически"
Понял только то, что надо либо классы В и С наследовать классу А, либо наоборот, либо вообще объявить класс C_Event_Log как глобальный объект и тогда пользовать его методы откуда угодно по всей программе. Правильно?
sich_zp вне форума Ответить с цитированием
Старый 15.08.2011, 12:20   #9
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Семантика - эт как бы так сказать, показатель поведения и отношений. В нашем случае.

Вообще вам судя по всему надо бы просто наследовать всё это дело

Код:
class C_Event_Log
{
    //private элементы класса

protected:
    //private элементы класса, которые будут доступны в MainMenu и Automat

public:
    //методы класса C_Event_Log
};

class MainMenu : public C_Event_Log
{
     //private элементы

public:
     //ну и так понятно.
};

class Automat : public C_Event_Log
{
     //private элементы

public:
     //методы
};
Теперь методы класса C_Event_Log доступны в его потомках (в классах MainMenu и Automat)
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 15.08.2011, 12:38   #10
sich_zp
 
Регистрация: 15.08.2011
Сообщений: 8
По умолчанию

это все понятно! Но будут ли передаваться данные из одного класса в другой.
Класс C_Event_Log у меня реализует журнал аварий и событий. А в классах C_Menu и C_Automat будет использоваться метод класса C_Event_Log для создания конкретных событий или аварий. Т.е. будет вызываться всего один метод Add(), в котором используется очередь FIFO, т.е. метод Add класса C_Event_Log всего лишь добавляет очередное событие в очередь и все!!!! Далее я из основного класса Application буду вызывать метод Run(), который уже во влешь память будет сохранять всю очередь. Так же из класса Application я буду вызывать методы ReadNext(char *); и ReadPrev(char *); класса C_Event_Log для отображения следующего или предыдущего события из флеш памяти.
Отсюда следует, что мне надо видеть методы класса C_Event_Log и передавать все данные из классов C_Menu и C_Automat и далее уже с классом будет работать основной класс Application.
Фуф... вроде постарался описать понятно...
sich_zp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Видимость переменной alexz29 PHP 3 19.02.2011 12:02
видимость переменных и методов в c# Sparky Помощь студентам 5 26.07.2010 20:20
При удалении записей значения полей с type:=Autoincrement (т.е+) в оставшихся полей не изменяются kenta БД в Delphi 2 29.10.2009 08:28
Объеденение полей запроса в для отображения нескольких полей в одном списке mrCreator Microsoft Office Access 3 08.08.2009 00:53
Видимость полей в подчиненной форме Sparxy Microsoft Office Access 2 02.06.2009 21:40