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

Перегрузка операторов и string - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Цикл с постусловием: поиск элемента с заданными свойствами http://www.cyberforum.ru/cpp-beginners/thread697239.html
Известны данные о мощности двигателя 30 моделей легковых автомобилей. Выяснить, есть ли среди них модель, мощность двигателя которой превышает 200 л.с. Помогите буду заранее блогодарен,начал изучать недавно С++
C++ найти все различающиеся элементы целочисленной квадратной матрицы нужна ваша помощь! напишите код проги http://www.cyberforum.ru/cpp-beginners/thread697236.html
C++ Вычислить сумму ряда (результат - приближенное значение функции exp в точке X)
while do 1) Дано вещественное число X и целое число N (> 0). Найти значение выражения + X + X2/(2!) + … + XN/(N!) (N! = 1•2•…•N). Полученное число является приближенным значением функции exp в точке X. 2)Имеется фрагмент программы в виде оператора цикла с параметром,обеспечивающий вывод на экран "столбиком" всех целых чисел от 100 до 80 .Оформить этот фрагмент в виде: оператора цикла с...
Известны данные о мощности двигателя 30 моделей легковых автомобилей. Выяснить, есть ли среди них модель, мощность двигателя которой превышает 200 л.с C++
1) я незнаю как сделать эту задачу через for Известны данные о мощности двигателя 30 моделей легковых автомобилей. Выяснить, есть ли среди них модель, мощность двигателя которой превышает 200 л.с.
C++ Перемножение двумерных массивов http://www.cyberforum.ru/cpp-beginners/thread697220.html
Помогите пожалуйста перемножить два двумерных массива (выразить линейный комбинации) допустим есть 2мерный массив G со строками 1 1 0 0 1 1 надо умножить на 2мерный массив U 0 0 0 1 1 0
C++ Доступ к методам производного класса Есть базовый класс CJobGeneral. В нём описано несколько методов. Есть унаследованный от него CJobCitomir с рядом своих методов. Есть третий класс CGenPjct, в котором объявляется переменная класса CJobGeneral: static CJobGeneral* m_Job; В классе CGenPjct есть функция, которая должна присвоить переменной m_Job объект либо класса CJobGeneral, либо CJobCitomir, в зависимости от переданного ей... подробнее

Показать сообщение отдельно
milvus
0 / 0 / 0
Регистрация: 14.11.2012
Сообщений: 35
16.11.2012, 20:34  [ТС]     Перегрузка операторов и string
\stack_iter.h(15): error C2597: illegal reference to non-static member 'stack::_stack'
\stack_iter.h(15): error C3867: 'stack::_stack': function call missing argument list; use '&stack::_stack' to create a pointer to member
\stack_iter.h(15): error C2109: subscript requires array or pointer type

и так на каждый перегруженный оператор итераторов

Добавлено через 4 часа 44 минуты
Kastaneda спасибо, посмотрел но на данном этапе не все понял в коде, мне проще добить свой вариант да и хотелось бы все таки разобраться с моими ошибками
Вот как я сделал, в чем я не прав???
Добавил в класс итераторов переменную
C++
1
static stack _obj;
в которую при вызове
C++
1
stack1.begin()
кладется объект стека который вызвал этот метод
далее при любой операции с итераторами я ссылался на этот объект например
C++
1
2
int operator * () const
{return _obj._stack[_index];}
Откудато появилась ошибка при работе с обычным итератором вектора, раньше все работало нормально
vector<int>::iterator iter = _stack.begin();

C2440: 'initializing' : cannot convert from 'std::_Vector_const_iterator<_Myvec>' to 'std::_Vector_iterator<_Myvec>'

меняю на vector<int>::const_iterator iter = _stack.begin();

появляется вот это
error LNK2001: unresolved external symbol "private: static class stack stack::stack_iterator::_obj" (?_obj@stack_iterator@stack@@0V2@A)


вот исходники
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
#include <string>   // тип исп. в классе!
#include <vector>       // там вектор использующийся в классе
#include <algorithm> // там нужная классу функция find
#include <iostream>     //cout cin
 
 
using namespace std;
 
 
/*предварительное объявление класса, */
 
//class stack;  // объявление
//class stack_iterator;
 
class stack
{
friend class stack_iterator;    // говорит что класс итераторов стека может пользоваться приват объектами (_index) данного класса!
public:     
 
/*КЛАСС ИТЕРАТОРОВ*/
/*вложенный класс он нужен чтобы можно было объявлять тип итераторов
вот так stack::iterator*/
 
class stack_iterator
{
friend class stack; // друг так как мы берем из него вектор !
public: 
    /*ИТЕРАТОРЫ и операции над ними*/
    stack_iterator(int ind) // конструктор инициализация 1 числом!!!
        :_index (ind-1) // _index номер текущего элемента
    {} 
 
    bool operator == (const stack_iterator & rhs) const // бинарный поэтому 2 опернда один в скобках второй вызываемый
    {return _index == rhs._index;}  // 2 итератора равны если равны их индексы!!
    bool operator != (const stack_iterator & rhs) const
    {return !(*this == rhs);}   // через уже определенную операцию или  _index != rhs._index 2 итератора не равны если не равны их индексы!!
    int operator * () const // разименование итератора! КАК член класса можно и как отд. функция см. за определ класса!!!!!!!!!!
    {return _obj._stack[_index];}//обращение к _elems возможно так как этот класс объявлен как друг для класса stack
    /*приф и постфиксные операторы перегруженные поэтому должны отличаться
    набором параметров, на самомо деле сам компилятор генерирует его
    поэтому делатеся все как обычно ++it; it++;*/
    int  operator ++() // префикс
    { ++_index; return _obj._stack[_index];}
    int  operator ++(int)   // постфикс
    {return _obj._stack[_index++];}
    int  operator --() // префикс
    { --_index; return _obj._stack[_index];}
    int  operator --(int)   // постфикс
    {return _obj._stack[_index--];}
private:
    int _index; //для ИТЕРАТОРОВ
    static stack _obj; // указатель на объект класса стек который инициализируется при объявлении st1.begin() например
};
 
 
    friend int stack_iterator::operator * () const;
 
    stack(vector<int> &m); // КОНСТРУКТОР
    stack();
 
    bool push (const int &elem);    // добавляет эл. в конец удаляя начало
    bool pop (int &elem);       // вынимает последний эл с его удалением
    
    bool peek (int &elem) const;    // читает последний элемент без удаления и говорит что этот мето не изменяет данные в переменной этого класса!!!!
 
    void clear();                   // очистка стека
 
    bool find(const int &elem) const;   // поиск заданного элемента по стеку и говорит что этот мето не изменяет данные в переменной этого класса!!!!
    int count(const int &elem) const;   // сколько раз этот элемент встречается в стеке! и говорит что этот мето не изменяет данные в переменной этого класса!!!!
 
    bool full () const; // переполнение и говорит что этот мето не изменяет данные в переменной этого класса!!!!
    bool empty () const;    // пустой и говорит что этот мето не изменяет данные в переменной этого класса!!!!
    /*все функции определенные прямо при определении класса автоматом являются подставляемыми!!*/
    int size() const {return _stack.size(); } //определение функции даро прямо внутри класса остальные ф-ии просто объявлены и говорит что этот мето не изменяет данные в переменной этого класса!!!!
    void info() const;  // показывает инф о стеке,  с исп указателя this
    
    //для ИТЕРАТОРОВ
    typedef stack_iterator iterator; // вызывать не stack::stack_iterator а stack::iterator
 
    //Вызов функций итераторов!!
    stack_iterator begin() const
    {
        stack_iterator::_obj = *this;
        return stack_iterator(1);// создает объект класса stack_iterator с _index = 0 (-1)
    } 
    stack_iterator end() const
    {
        stack_iterator::_obj = *this;
        return stack_iterator(_stack.size());// создает объект класса stack_iterator с _index = конец стека!
    } 
 
private:    // доступны только функциям членам и друзьям класса, там определения функции членов!
    /*static*/ vector<int> _stack;  // вектор с элементами стека статик поэтому его надо объявить вне класса статик чтобы итераторы могли им пользоваться!!
 
 
 
 
    enum    
    {
       _stack_max_size = 20 // размер стека
    };  
    
};
 
// КОНСТРУКТОР
stack::stack(vector<int> &m) // инициазизация вектором
{
    vector<int>::iterator first = m.begin();
    for (int i=0;( first != m.end() && i != _stack_max_size); i++,first++)
                _stack.push_back(m[i]); // если указатель на вектор пустой то сюда вообще не зайдем
}
stack::stack(){} // если создат стек без параметров то надо его инициализировать пустым вектором _stack когда уберу static
 
// Информация о стеке с исп указателя this
void stack::info() const 
/* *this ссылается на тот объект данного класса
* который вызвал данный метод!!!!!*/
{
if ( this->empty() ) //this УКАЗАТЕЛЬ на тот объект который вызывал этот метод!!!
    std::cout << "stack clear: size = ";
else if ( this->full() )
    std::cout << "stack full: size = ";
else 
    std::cout << "stack have elem: size = ";
cout << this->size() << endl;
}
// пустой и говорит что этот мето не изменяет данные в переменной этого класса!!!!
inline bool stack::empty() const // stack:: оператор области видимости класса это позволяет ее отличать скажем от vector.empty()
{
    return _stack.empty(); // а это уже vector.empty()
}
// переполнение и говорит что этот мето не изменяет данные в переменной этого класса!!!!
inline bool stack::full() const // stack:: область видимости класса это позволяет ее отличать скажем от vector.empty()
{
    return _stack.size() == _stack_max_size/*_stack.max_size()*/; // возвращает логическое значение 1 если размер = максимальному для стека (можно задать или исп ограничения для класса вектор)
}
// добавляет эл. в конец удаляя начало
bool stack::push (const int &elem)  // добавляет эл. в конец удаляя начало
{
        if ( full() )       //full() означает stack::full() ведь мы используем область видимости класса
            return false;   // выйти с ошибкой
        _stack.push_back(elem);
        return true;
}
// вынимает последний эл с его удалением
bool stack::pop (int &elem) // stack:: область видимости класса это позволяет ее отличать скажем от vector.empty()
{
    if ( empty() )      //empty() означает stack.empty() ведь мы используем область видимости класса
        return false;   // выйти с ошибкой
    elem = _stack.back(); // приравниваем к последнему
    _stack.pop_back();  // удаляем последний
    return true;        // операция закончена успешно
}
// читает последний элемент без удаления и говорит что этот мето не изменяет данные в переменной этого класса!!!!
bool stack::peek (int &elem) const
{
    if ( empty() )      //empty() означает stack.empty() ведь мы используем область видимости класса
        return false;   // выйти с ошибкой
    elem = _stack.back();// приравниваем к последнему
    return true;        // операция закончена успешно
}
// поиск заданного элемента по стеку и говорит что этот мето не изменяет данные в переменной этого класса!!!!
bool stack::find(const int &elem) const 
{
    if ( empty() )      //empty() означает stack.empty() ведь мы используем область видимости класса
        return false;   // выйти с ошибкой
/*std:: если явно не писать то будет вызваться find класса а не стандартный find*/
    if ( std::find(_stack.begin(), _stack.end(), elem) != _stack.end() ) // если итератор найденного элемента не за пределами вектора
        return true;
    else
        return false;
}
// сколько раз этот элемент встречается в стеке! и говорит что этот мето не изменяет данные в переменной этого класса!!!!
int  stack::count(const int &elem) const    
{
    if ( empty() )      //empty() означает stack.empty() ведь мы используем область видимости класса
        return 0;   // выйти с ошибкой
 
    vector<int>::const_iterator iter = _stack.begin();
    int count = 0;
 
    while ( (iter = std::find(iter, _stack.end(), elem) ) != _stack.end()   ) // FIND не класса а из STL
/*std:: если явно не писать то будет вызваться find класса а не стандартный find*/
    {
        ++count;
        ++iter;
// итератор указывает на последний элемент а не на end() после прибавления!?
    }
    return count;
}
// очистка стека
void stack::clear() 
{
    _stack.clear();
}
 
//vector<int> stack::_stack;    // явное объявление static вектора некоторого класса!
stack _obj;// явное объявление static указатель на объект класса стек который инициализируется при объявлении st1.begin() например
Добавлено через 22 часа 22 минуты
Нет никаких идей? Эта тема мне покоя не дает, не могу читать книгу дальше, пока с этим не разберусь!
 
Текущее время: 08:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru