Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
balrak
6 / 6 / 1
Регистрация: 01.04.2012
Сообщений: 81
#1

Friend класса - C++

23.04.2012, 21:00. Просмотров 1276. Ответов 4
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
 
class assoc
{
    struct pair
    {
        char* name;
        int val;
    };
    int free;
    int max;
    pair* vec;
    assoc(const assoc&);
    assoc& operator=(const assoc&);
    friend class assoc_iterator;
public:
    assoc(int);
    int& operator[](const char*);
    void print_all();
};
 
assoc::assoc(int a)
{
    max = (a < 16) ? 16 : a;
    free = 0;
    vec = new pair[max];
}
 
int& assoc::operator[](const char* p)
{
    register pair* pp;
    for (pp = &vec[free-1]; vec <= pp ; pp--)
        if(strcmp(p,pp->name) == 0)
            return pp->val;
    if(max == free)
    {
        pair* nvec = new pair[max*2];
        for(int i = 0; i< max; i++)
            nvec[i] = vec[i];
        delete vec;
        vec = nvec;
        max *=2;
    }
    pp = &vec[free++];
    pp->name = new char[strlen(p)+1];
    strcpy(pp->name, p);
    pp->val = 0;
    return pp->val;
}
 
void assoc::print_all()
{
    for(int i = 0; i < free; i++)
        std::cout << vec[i].name << ":" << vec[i].val << "\n";
}
 
class assoc_iterator
{
    const assoc* cs;
    int i;
public:
    assoc_iterator(const assoc& s){cs = &s ; i = 0;}
    pair* operator()() //не дает доступ
    {
        return (i < cs->free) ? &cs->free[i++] : 0;
    }
};
 
void main()
{
    const int max =256;
    char buf[max];
    assoc vec(512);
    while(std::cin >> buf)
        vec[buf]++;
    assoc_iterator next(vec);
    pair* p; //как создать элемент указывающий на pair?
    while(p = next(vec))
        std::cout << p->name << ":" << p->val << "\n";
}
помогите разобратся
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2012, 21:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Friend класса (C++):

Как объявить friend функцию класса - C++
как это оформить, чтобы работало // ----------&gt; one.h #include &quot;two.h&quot; #ifndef ONE_H_INCLUDED #define ONE_H_INCLUDED #include...

Не могу обратиться к Privat члену класса из ф-и Friend. Почему? - C++
не нашел ответ на свой вопрос... есть класс class Product { char cmName, cmType; double cmPriceIn, cmPriceOut; ...

Как правильно использовать friend для доступа к экземпляру класса - C++
Доброго времени суток. Проблема - нужно из одного класса обратиться к методам экземпляра другого класса знаю, что для этого нужно как-то...

Как переделать friend-перегрузки ввода/вывода в метод класса? - C++
Доброго времени суток! Есть вопрос: как переделать френдовые перегрузки ввода\вывода в метод класса? Или же как шаблонить френдовые...

friend функции не имеют доступа к private элементам класса, почему? - C++
Учусь по Лафоре Р. - Объектно-ориентированное программирование в С++ (Классика Computer Science) - 2004. Выполняю задания на Microsoft...

Перегрузка операторов, friend или нет friend? - C++
Всем здравствуйте. Есть такой вопрос: при перегрузке операторов в классе(пусть будут + и = (вообще неважно, за исключением потока)) как и...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
23.04.2012, 21:04 #2
не думаю, что это рабочая программа
balrak
6 / 6 / 1
Регистрация: 01.04.2012
Сообщений: 81
23.04.2012, 21:30  [ТС] #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
 
class assoc
{
    struct pair
    {
        char* name;
        int val;
    };
    int free;
    int max;
    pair* vec;
    assoc(const assoc&);
    assoc& operator=(const assoc&);
    friend class assoc_iterator;
public:
    assoc(int);
    int& operator[](const char*);
    void print_all();
};
 
assoc::assoc(int a)
{
    max = (a < 16) ? 16 : a;
    free = 0;
    vec = new pair[max];
}
 
int& assoc::operator[](const char* p)
{
    register pair* pp;
    for (pp = &vec[free-1]; vec <= pp ; pp--)
        if(strcmp(p,pp->name) == 0)
            return pp->val;
    if(max == free)
    {
        pair* nvec = new pair[max*2];
        for(int i = 0; i< max; i++)
            nvec[i] = vec[i];
        delete vec;
        vec = nvec;
        max *=2;
    }
    pp = &vec[free++];
    pp->name = new char[strlen(p)+1];
    strcpy(pp->name, p);
    pp->val = 0;
    return pp->val;
}
 
void assoc::print_all()
{
    for(int i = 0; i < free; i++)
        std::cout << vec[i].name << ":" << vec[i].val << "\n";
}
 
class assoc_iterator
{
    const assoc* cs;
    int i;
public:
    assoc_iterator(const assoc& s){cs = &s ; i = 0;}
    /*pair* operator()()
    {
        return (i < cs->free) ? &cs->free[i++] : 0;
    }*/
};
 
void main()
{
    const int max =256;
    char buf[max];
    assoc vec(512);
    while(std::cin >> buf)
        vec[buf]++;
    assoc_iterator next(vec);
   /* pair* p;
    while(p = next(vec))
        std::cout << p->name << ":" << p->val << "\n";*/
}
если закоментировать не рабочие места то все работает

Добавлено через 13 минут
C++
1
2
3
4
pair* operator()()
* * {
* * * * return (i < cs->free) ? &cs->free[i++] : 0;
* * }
почему элемн free видет , а pair нет?
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
23.04.2012, 21:53 #4
Потому что ты пишешь нечто нелепое.
Цитата Сообщение от balrak Посмотреть сообщение
? &cs->free[i++]
free - это не массив.
Ты сколько времени С++ изучаешь?
balrak
6 / 6 / 1
Регистрация: 01.04.2012
Сообщений: 81
23.04.2012, 21:59  [ТС] #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
 
class assoc
{
    friend class assoc_iterator;
    struct pair
    {
        char* name;
        int val;
    };
    int free;
    int max;
    pair* vec;
    assoc(const assoc&);
    assoc& operator=(const assoc&);
public:
    assoc(int);
    int& operator[](const char*);
    void print_all();
};
 
assoc::assoc(int a)
{
    max = (a < 16) ? 16 : a;
    free = 0;
    vec = new pair[max];
}
 
int& assoc::operator[](const char* p)
{
    register pair* pp;
    for (pp = &vec[free-1]; vec <= pp ; pp--)
        if(strcmp(p,pp->name) == 0)
            return pp->val;
    if(max == free)
    {
        pair* nvec = new pair[max*2];
        for(int i = 0; i< max; i++)
            nvec[i] = vec[i];
        delete vec;
        vec = nvec;
        max *=2;
    }
    pp = &vec[free++];
    pp->name = new char[strlen(p)+1];
    strcpy(pp->name, p);
    pp->val = 0;
    return pp->val;
}
 
void assoc::print_all()
{
    for(int i = 0; i < free; i++)
        std::cout << vec[i].name << ":" << vec[i].val << "\n";
}
 
class assoc_iterator
{
    const assoc* cs;
    int i;
public:
    assoc_iterator(const assoc& s){cs = &s ; i = 0;}
    pair* operator()()
    {
        return (i < cs->free) ? &cs->vec[i++] : 0;
    }
};
 
void main()
{
    const int max =256;
    char buf[max];
    assoc vec(512);
    while(std::cin >> buf)
        vec[buf]++;
    assoc_iterator next(vec);
   /* pair* p;
    while(p = next(vec))
        std::cout << p->name << ":" << p->val << "\n";*/
}
Да затупил
Исправил
Изучаю его не долго
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2012, 21:59
Привет! Вот еще темы с ответами:

Перегрузка операций: friend-функция или функция-член класса - C++
Здравствуйте, меня интересует вопрос, в чем разница при перегрузке операторов через operator и friend. Вот к примеру такой код. class...

Friend для friend - C++
всем доброго времени суток, покажу проблему на примере: Class B; class A{ int F; friend B; public: A(){F=0;}; };

friend class - C++
#include &lt;iostream&gt; using namespace std; #include &lt;string&gt; using std::string; class two; class one { friend...

friend function - C++
После добавления дружественной ф-ции sum( а она для сложения salary у человека, которого я выберу) класс перестал работать. Что у меня не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.04.2012, 21:59
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru