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

Friend класса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
balrak
6 / 6 / 1
Регистрация: 01.04.2012
Сообщений: 81
23.04.2012, 21:00     Friend класса #1
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";
}
помогите разобратся
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
23.04.2012, 21:04     Friend класса #2
не думаю, что это рабочая программа
balrak
6 / 6 / 1
Регистрация: 01.04.2012
Сообщений: 81
23.04.2012, 21:30  [ТС]     Friend класса #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
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
23.04.2012, 21:53     Friend класса #4
Потому что ты пишешь нечто нелепое.
Цитата Сообщение от balrak Посмотреть сообщение
? &cs->free[i++]
free - это не массив.
Ты сколько времени С++ изучаешь?
balrak
6 / 6 / 1
Регистрация: 01.04.2012
Сообщений: 81
23.04.2012, 21:59  [ТС]     Friend класса #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";*/
}
Да затупил
Исправил
Изучаю его не долго
Yandex
Объявления
23.04.2012, 21:59     Friend класса
Ответ Создать тему
Опции темы

Текущее время: 14:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru