Форум программистов, компьютерный форум 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
14.11.2012, 12:19     Перегрузка операторов и string
есть класс имитирующий стек, все методы проверены и работают правильно! Кроме части касающейся итераторов

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
#include <string>   // тип исп. в классе!
#include <vector>       // там вектор использующийся в классе
#include <algorithm> // там нужная классу функция find
#include <iostream>     //cout cin
#include "stack_iter.h"
 
using namespace std;
 
 
/*предварительное объявление класса, */
 
class stack;    // 
class stack_iterator;
 
class stack
{
friend class stack_iterator;    // говорит что класс итераторов стека может пользоваться приват объектами данного класса!
public:     
    stack(vector<string> &m); // КОНСТРУКТОР
 
    bool push (const string &elem); // добавляет эл. в конец удаляя начало
    bool pop (string &elem);        // вынимает последний эл с его удалением
    
    bool peek (string &elem) const; // читает последний элемент без удаления и говорит что этот мето не изменяет данные в переменной этого класса!!!!
    void clear();                   // очистка стека
 
    bool find(const string &elem) const;    // поиск заданного элемента по стеку и говорит что этот мето не изменяет данные в переменной этого класса!!!!
    int count(const string &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
    {return stack_iterator(0);} // создает объект класса stack_iterator с _index = 0
    stack_iterator end() const
    {return stack_iterator(_stack.size() -1 );} // создает объект класса stack_iterator с _index = конец стека!
private:    // доступны только функциям членам и друзьям класса, там определения функции членов!
    vector<string> _stack;  // вектор с элементами стека
 
 
    enum    
    {
       _stack_max_size = 20 // размер стека
    };  
    
};
 
// КОНСТРУКТОР
stack::stack(vector<string> &m) // инициазизация вектором
{
    vector<string>::iterator first = m.begin();
    for (int i=0;( first != m.end() && i != _stack_max_size); i++,first++)
                _stack.push_back(m[i]); // если указатель на вектор пустой то сюда вообще не зайдем
}
 
// Информация о стеке с исп указателя 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 string &elem)   // добавляет эл. в конец удаляя начало
{
        if ( full() )       //full() означает stack::full() ведь мы используем область видимости класса
            return false;   // выйти с ошибкой
        _stack.push_back(elem);
        return true;
}
// вынимает последний эл с его удалением
bool stack::pop (string &elem) // stack:: область видимости класса это позволяет ее отличать скажем от vector.empty()
{
    if ( empty() )      //empty() означает stack.empty() ведь мы используем область видимости класса
        return false;   // выйти с ошибкой
    elem = _stack.back(); // приравниваем к последнему
    _stack.pop_back();  // удаляем последний
    return true;        // операция закончена успешно
}
// читает последний элемент без удаления и говорит что этот мето не изменяет данные в переменной этого класса!!!!
bool stack::peek (string &elem) const
{
    if ( empty() )      //empty() означает stack.empty() ведь мы используем область видимости класса
        return false;   // выйти с ошибкой
    elem = _stack.back();// приравниваем к последнему
    return true;        // операция закончена успешно
}
// поиск заданного элемента по стеку и говорит что этот мето не изменяет данные в переменной этого класса!!!!
bool stack::find(const string &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 string &elem) const 
{
    if ( empty() )      //empty() означает stack.empty() ведь мы используем область видимости класса
        return 0;   // выйти с ошибкой
 
    vector<string>::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();
}
И есть класс итераторов для класса stack, для начала стек это набор элементов типа string, вот с этим и возникли проблемы, все перегруженные операторы возвращающие string дают ошибку в MVStudio 2010 не понимаю как с этим справиться подскажите пожалуйста!

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
#include <string>   // тип исп. в классе!
//#include "stack.h"
//#include <vector>     // там вектор использующийся в классе
 
/*КЛАСС ИТЕРАТОРОВ*/
class stack_iterator
{
friend class stack; // друг так как мы берем из него вектор !
public: 
    /*ИТЕРАТОРЫ и операции над ними*/
    stack_iterator(int ind) // конструктор инициализация 1 числом!!!
    {_index = ind;} // _index номер текущего элемента
 
    bool operator == (const stack_iterator & rhs) const
    {return _index == rhs._index;}  // 2 итератора равны если равны их индексы!!
    bool operator != (const stack_iterator & rhs) const
    {return !(*this == rhs);}   // через уже определенную операцию или  _index != rhs._index 2 итератора не равны если не равны их индексы!!
    string operator * (const stack_iterator & rhs) const    // разименование итератора! КАК член класса можно и как отд. функция см. за определ класса!!!!!!!!!!
    {return stack::_stack[_index];}//обращение к _elems возможно так как этот класс объявлен как друг для класса stack
    /*приф и постфиксные операторы перегруженные поэтому должны отличаться
    набором параметров, на самомо деле сам компилятор генерирует его
    поэтому делатеся все как обычно ++it; it++;*/
    string  operator ++() // префикс
    { ++_index; return stack::_stack[_index];}
    string  operator ++(int)    // постфикс
    {return stack::_stack[_index++];}
    string  operator --() // префикс
    { --_index; return stack::_stack[_index];}
    string  operator --(int)    // постфикс
    {return stack::_stack[_index--];}
private:
    int _index; //для ИТЕРАТОРОВ
 
};
 
// вариант перегруженной функции разименования не члена класса
//inline int operator * (const stack_iterator & rhs)
//{
////    rhs.chek_integrity();
//  return stack::_stack[rhs._index];
//}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 06:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru