Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Цикл с постусловием: поиск элемента с заданными свойствами http://www.cyberforum.ru/cpp-beginners/thread697239.html
Известны данные о мощности двигателя 30 моделей легковых автомобилей. Выяснить, есть ли среди них модель, мощность двигателя которой превышает 200 л.с. Помогите буду заранее блогодарен,начал изучать...
C++ найти все различающиеся элементы целочисленной квадратной матрицы нужна ваша помощь! напишите код проги http://www.cyberforum.ru/cpp-beginners/thread697236.html
Как правильно написать код? C++
Что надо изменить в этом коде, что бы он работал? Задание: Заданы графики двух функций f1(x) =(1/2)^x , f2(x) =1+(x/2). Надо найти площадь криволинейной трапеции ограниченную графиками этих...
C++ Вычислить сумму ряда (результат - приближенное значение функции exp в точке X)
while do 1) Дано вещественное число X и целое число N (> 0). Найти значение выражения + X + X2/(2!) + … + XN/(N!) (N! = 1•2•…•N). Полученное число является приближенным значением функции exp в...
C++ Известны данные о мощности двигателя 30 моделей легковых автомобилей. Выяснить, есть ли среди них модель, мощность двигателя которой превышает 200 л.с http://www.cyberforum.ru/cpp-beginners/thread697221.html
1) я незнаю как сделать эту задачу через for Известны данные о мощности двигателя 30 моделей легковых автомобилей. Выяснить, есть ли среди них модель, мощность двигателя которой превышает 200 л.с.
C++ Перемножение двумерных массивов Помогите пожалуйста перемножить два двумерных массива (выразить линейный комбинации) допустим есть 2мерный массив G со строками 1 1 0 0 1 1 надо умножить на 2мерный массив U 0 0 0 1 1 0 подробнее

Показать сообщение отдельно
milvus
0 / 0 / 0
Регистрация: 14.11.2012
Сообщений: 35
14.11.2012, 13:06  [ТС]
со static спасибо, не заметил
да наверное лучше указатели но мне надо чтоб хоть как то заработало, а потом уже можно модифицировать,
наплюнул и переписал все ни тип int, но осталась небольшая проблема

stack.h подключает stack_iter.h
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<int> &m); // КОНСТРУКТОР
 
    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
    {return stack_iterator(0);} // создает объект класса stack_iterator с _index = 0
    stack_iterator end() const
    {return stack_iterator(_stack.size() -1 );} // создает объект класса 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]); // если указатель на вектор пустой то сюда вообще не зайдем
}
 
// Информация о стеке с исп указателя 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>::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_iter.h, он не знает класса stack им не видит переменной _stack
error C2027: use of undefined type 'stack'
error C2065: '_stack' : undeclared identifier
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
#include <string>   // тип исп. в классе!
 
#include <vector>       // там вектор использующийся в классе
 
//#include "stack.h"
 
class stack;
 
 
/*КЛАСС ИТЕРАТОРОВ*/
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 итератора не равны если не равны их индексы!!
    int operator * (const stack_iterator & rhs) const   // разименование итератора! КАК член класса можно и как отд. функция см. за определ класса!!!!!!!!!!
    {return stack::_stack[_index];}//обращение к _elems возможно так как этот класс объявлен как друг для класса stack
    /*приф и постфиксные операторы перегруженные поэтому должны отличаться
    набором параметров, на самомо деле сам компилятор генерирует его
    поэтому делатеся все как обычно ++it; it++;*/
    int  operator ++() // префикс
    { ++_index; return stack::_stack[_index];}
    int  operator ++(int)   // постфикс
    {return stack::_stack[_index++];}
    int  operator --() // префикс
    { --_index; return stack::_stack[_index];}
    int  operator --(int)   // постфикс
    {return stack::_stack[_index--];}
private:
    int _index; //для ИТЕРАТОРОВ
 
};
как можно сделать чтобы оба класса видели private переменные друг друга и вообще друг друга? вроде оба друзья друг для друга...
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.