Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дружественные классы и функции, пример 
:(
    Опции темы
Nick112411
Дата 7.12.2006, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Здравствуйте. Нужно написать простенькую программу на любую тему, демонстрирующую работу дружественных классов или функций. Если есть исходник любой, выложите пожалуйста  Спасибо.
PM MAIL   Вверх
paSha_X
Дата 7.12.2006, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 5.12.2006
Где: Беларусь, Минск

Репутация: 1
Всего: 2



Упрости если чё, главное смысл.......
Код

#include<iostream.h>
#include<string.h>
#include<stdio.h>
class stroka
{    char str[20];
public:
    void set(char* s){strcpy(str,s);}//метод присваивания значений объектам
    void show(){cout<<str<<endl;}//метод вывода данных объекта на экран 
    
    friend void zamena(stroka *ob, int kol)//метод замены выбранных строк
    {    int i,ii,v;char s[20];
        
        for(;;)
        {    cout<<"Vvedennie stroki:"<<endl;
            for(i=0;i<kol;i++)// вывод этих строк на экран
            {cout<<"Stroka "<<i+1<<": "; ob[i].show();}
        
            cout<<"kakuiy stroku vi hotite zamenit?";cin>>ii; 
            cout<<"Vvedite novuyu stroku (bez probela): ";cin>>s;
            ob[ii-1].set(s);//присваивание объекту нового значения
            cout<<"Zamenit esche...(1)  Vozvrat k menu...(2):"; cin>>v;
            switch(v){//выбор "продолжить"или "вернуться к меню"
            case 1: ;break;
            case 2:return;}
        }

    
    }
    friend void sravnenie(stroka *ob,int kol)//метод сравнения строк
    { int i,j,ii,p=1;
    
    cout<<"Vvedennie stroki:"<<endl;
            for(ii=0;ii<kol;ii++)//вывод введенных в main() строк
            {cout<<"Stroka "<<ii+1<<": "; ob[ii].show();}
    for(i=0;i<kol-1;i++)// сравнение предыдущей строки...
        for(j=1;j<kol;j++)//...с последующей
        {    if(i==j) break;//не сравнивать строку саму с собой
            if(strcmp(ob[i].str,ob[j].str)==0)// если строки равны
            {    
                cout<<"Stroka "<<i+1<<" ravna stroke "<<j+1<<endl;//вывод номеров этих строк
                p=0;
            }
        }
        if(p) cout<<"Ravnih strok net!!!"<<endl;
    
    }
    friend void revers(stroka *ob,int kol)//метод реверса строк
    {int i,j,ii,s,v;
    
    for(;;){
        cout<<"Vvedennie stroki:"<<endl;
            for(i=0;i<kol;i++)//вывод введенных в main() строк
            {cout<<"Stroka "<<i+1<<": "; ob[i].show();}
    
            cout<<"Kakuyu stroku vi hotite perevernut?"; cin>>s;
        ii=strlen (ob[s-1].str);//определение длины выбранной строки
        for(j=ii;j>=0;j--)//вывод перевернутой строки
        cout<<ob[s-1].str[j];
        cout<<'\n'<<"Revers esche odnoy stroki...(1)  Vozvrat k menu...(2):"; 
        cin>>v;
            switch(v){//выбор "продолжить"или "вернуться к меню"
            case 1: ;break;
            case 2:return;}
            }
    cout<<endl;
    }

    
};
void main()
{
stroka ob[10];//создан массив из 10 объектов

char s[20]; 
int kol,v,lim,i;
while(1){
      cout<<"****MENU****"<<'\n'<<"Vvod strok..................(1)"<<'\n'
                                <<"Zamena vibrannih strok......(2)"<<'\n'
                                <<"Sravnenie vvedennih strok...(3)"<<'\n'
                                <<"Revers vibrannih strok......(4)"<<'\n'
                                <<"Exit........................(5)"<<endl;
        cin>>v;    
        switch(v){
        case 1:    lim=0;//ввод
                cout<<"Skolko hotite strok(ne bolee 10)? "; cin>>kol;
                for(i=0;i<kol;i++)
                {
                cout<<"Vvedite stroku (bez probela) "<<lim+1<<':';
                cin>>s;
                ob[i].set(s);
                lim++;
                }break;
        case 2:    zamena(ob,kol);break;//вызов метода замены строк
        case 3:sravnenie(ob,kol);break;//вызов метода сравнения строк
        case 4:revers(ob,kol);break;//вызов метода реверса строк строк
                } 
        }
}

PM MAIL WWW IM ICQ AOL YIM MSN   Вверх
Nick112411
Дата 8.12.2006, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Спасибо! Если есть попроще, выложите пожалуйста
PM MAIL   Вверх
paSha_X
Дата 8.12.2006, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 5.12.2006
Где: Беларусь, Минск

Репутация: 1
Всего: 2



Ну вот попроще.....
Код

#include<iostream.h>
class base
{    int x;
    int y;
public:
    void set(int xx, int yy){x=xx;y=yy;}
    friend void sum(base ob)
    {    int sum;
        sum=ob.x+ob.y;
        cout<<sum;
    }    
    };

void main()
{    int a,b;
    base ob;
    cin>>a;
    cin>>b;
    ob.set(a,b);
    sum(ob);

}

PM MAIL WWW IM ICQ AOL YIM MSN   Вверх
JackYF
Дата 8.12.2006, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



paSha_X, какой же ж это пример дружественных функций? Ничего бы в функциональности не изменилось, если бы ты убрал ключевое слово friend...

Суть дружественных функций в том, что в классе какая-либо функция объявляется дружественной(friend), но сама функция определяется за пределами класса... Может даже в другом .cpp - файле. Но при этом имеет доступ ко всем членам класса.

Переделаю немного этот пример:

Код

#include<iostream.h>
class base
{    
    int x;
    int y;
public:
    void set(int xx, int yy){x=xx;y=yy;}
    friend void sum(base ob);
        
};

void sum( base ob )
{      
        int sum;
        sum=ob.x+ob.y;
        cout<<sum;
}

void main()
{    int a,b;
    base ob;
    cin>>a;
    cin>>b;
    ob.set(a,b);
    sum(ob);
}


Что-нибудь типа такого.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Rockie
Дата 8.12.2006, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Nick112411, ну давай попробуем.

Код
#include<iostream>

using namespace std;

class B;          // B будет класс-друг; объявим его чтобы не было ошибки "класс B неизвестен"

 class A
 {
 friend class B;  // объявляем друга
                  // то есть класс B - друг нашего класса A
 public:
  void func_public(){cout<<"A::public\n";}
 protected:
  void func_protected(){cout<<"A::protected\n";}
 private:
  void func_private(){cout<<"A::private\n";}
 };

 class B         // раз нас объявили другом, имеем доступ в A
 {
 public:
  void func_any(){
   A a;
   //без friend-объявления нижеприведенные функции будут недоступны
   a.func_protected();
   a.func_private();
  }
 };

int main()
{

  B b;
  b.func_any();

  cout<<'\n';

  cin.get();
  return 0;
}


Код
#include<iostream>
                         // ПРОГРАММА -  ПРИМЕР ОБЪЯВЛЕНИЯ ФУНКЦИИ-ДРУГА
using namespace std;

void PrintValue();       // глобальная ф-я

 class A
 {
  friend void PrintValue();    // друг - внешняя функция
  public:
    A(int v=0):value(v){}
  private:
    int value;
 };

 void PrintValue()
 {
    A a(100);
    // внешняя функция друг имеет доступ к закрытым членам класса A
    cout<<"I'm printValue() and a.value is now = "<<a.value<<'\n';
 }

 int main()
 {
  PrintValue();

  cin.get();
  return 0;
 }


максимально упрощая: тот, кого объявили в классе другом, имеет доступ к любым членам этого класса. 

Но следует помнить, что friend - функции вообще противоречат ООП, так как нарушается инкапсуляция.


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
JackYF
Дата 8.12.2006, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Rockie @  8.12.2006,  22:30 Найти цитируемый пост)
Но следует помнить, что friend - функции вообще противоречат ООП, так как нарушается инкапсуляция. 


Вывод в поток чем будешь делать? smile


Просто не надо объявлять другом кого попало и пользоваться этим только в случае необходимости.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 8.12.2006, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Вывод в поток чем будешь делать?

отвечу за Rockie
для этого есть открытые методы
причем все, что можно вывести в поток, должно быть доступно через методы (иначе зачем скрывать содержимое, не делая к нему интерфейс и при этом выводить это самое во внешнюю среду?) 
при таком подходе в принципе friend можно не использовать

Это сообщение отредактировал(а) MAKCim - 8.12.2006, 22:48


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Rockie
Дата 9.12.2006, 03:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



MAKCim, спасибо! =)

Цитата(JackYF @  8.12.2006,  22:35 Найти цитируемый пост)
Просто не надо объявлять другом кого попало и пользоваться этим только в случае необходимости.

JackYF, ну я впринцыпе был уверен, что этой фразой даю повод подискутировать smile Но прежде можно прочитать вот эту простыню: Не пользуйтесь функциями типа get/set, объясните смысл написанного а потом спорить. Конечно, раз friend-функции существуют, значит "это кому-нибудь нужно" © smile Но это - зло.


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
zabivator
Дата 10.12.2006, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 7.6.2006
Где: нск

Репутация: 1
Всего: 2



Любое свойство языка может быть вредно в той же степени, что и полезно. всегда можно обойтись без френдов, однако всегда можно обойтись и без классов, не так ли ;)
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
Любитель
Дата 11.12.2006, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



В плане функционала - да. В плане проектирования - нет. А вот без френдов действительно можно обойтись всегда. Просто не всегда это традиция плюсов.


--------------------
PM MAIL ICQ Skype   Вверх
zabivator
Дата 11.12.2006, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 7.6.2006
Где: нск

Репутация: 1
Всего: 2



Любитель, традиционное использование френдов позволяет упростить код =) существенно =)
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
Fazil6
Дата 11.12.2006, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

Любитель, традиционное использование френдов позволяет упростить код =) существенно =)

открытые данные тоже, на первый взгляд, упрощают код.   )
PM MAIL   Вверх
zabivator
Дата 11.12.2006, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 7.6.2006
Где: нск

Репутация: 1
Всего: 2



Fazil6, нет. Они его просто ломают. Друзья - контролируемый способ доступа. Типа методов, только зыс не передается. А открытые члены - доступ откуда угодно... Как минимум невозможно поддержка инвариантов.
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
JackYF
Дата 11.12.2006, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Согласен с 
zabivator.

Не хочет класс дружить ни с кем - его право smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Любитель
Дата 12.12.2006, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(zabivator @  11.12.2006,  11:17 Найти цитируемый пост)
Любитель, традиционное использование френдов позволяет упростить код 


Согласен. Только надо разумно подходить. Зачастую без френдов можно сделать более качественный код.


--------------------
PM MAIL ICQ Skype   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0618 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.