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

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

Войти
Регистрация
Восстановить пароль
 
novak
2 / 2 / 0
Регистрация: 14.04.2011
Сообщений: 141
#1

Перегрузка функций в классе - C++

05.09.2012, 19:09. Просмотров 965. Ответов 14
Метки нет (Все метки)

Дано задание: 1.реализовать в классе работу стека; 2.применить перегрузку функций. Первое я реализовал без проблем, а вот со вторым проблема. Пожалуйста, подскажите в чем ошибка.

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
#include <iostream>
#include <windows.h>
#include <cmath>
using namespace std;
 
int b,c,i,q=1,h=1;
class Stack
{
public:
int data[100];
    void push();
    void pop();
    int zn(int b);
    long zn(long h);
};
void Stack::push()           //ВВЕДЕНИЕ В СТЕК
{
    for (int i=1; q!=0; i++)
    {cin >> data[i];
    q=data[i];
    b=i;}              //нужно чтобы присваивание было именно здесь
}
void Stack::pop()       //ДЕМОНСТРАЦИЯ ДАННЫХ В СТЕКЕ
{
c=b;
for (c--; c!=0; c--)
{cout << data[c] << "\n";}
}
int Stack::zn(int b)          //ЗНАЧЕНИЕ НА ВЕРШИНЕ СТЕКА
{
return (data[--b]);
}
int Stack::zn(int);
 
int main()
{SetConsoleOutputCP(1251);
int b,data[100];
long h;
    Stack S;
    cout << "Vvedite dannye v stek\n";
    cout << "Dlia ostanovki vvoda nazmite '0'" << endl;
    S.push();
    cout << "Rezultat:\n";
    S.pop();
    cout << "Stokovoe znachenie:\n"<<S.zn(h)<<endl;
    cout << "Znachenie na vershine steka:\n"<<S.zn(b)<<endl;
 
return 0;
}
long Stack::zn(long h)       //ЗНАЧЕНИЕ СТОКОВОЕ
{h=1;
return (data[h]);
}
Функция void push() осуществляет ввод числовых данных в Стек (после введения 0 -ввод прекращается); функция void pop()- введенные данные выводит на экран; функции int zn(int b) и long zn(long h)- являются перегруженными. Они должны выводить на экран соответственно топовое и стоковое значения, но этого не происходит. Вот в этом и загвоздка. Пожалуйста, подскажите что не так в листинге.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2012, 19:09     Перегрузка функций в классе
Посмотрите здесь:

Перегрузка в классе - C++
Реализую класс векторов с перегрузкой: #pragma once #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;stdlib.h&gt; ...

Перегрузка операции < в классе - C++
Хочу создать шаблон внутри класса Прототип template &lt;typename T&gt; bool operator&lt;(T &amp;); Определение template &lt;typename T&gt; ...

Перегрузка оператора '=' в классе - C++
#include &lt;iostream&gt; #include &lt;cstring&gt; using std::cout; using std::endl; class CMessage { public: ...

Перегрузка операторов в классе - C++
Привет всем снова! Пожалуста помотрите на класс, представьте что все нужные заголовки включены. class Point { public: Point(void) :...

ООП перегрузка в классе! - C++
Помогите решить: Нужно сделать чтобы корректно работало следующее: 1. MyString s1(&quot;AAA&quot;), s2; 2. s2=&quot;VVV&quot;; С первым все ок,...

Перегрузка операторов в классе - C++
Здравствуйте. Написал класс: template &lt;class T&gt; class LIST { private: T* listP; uint lSize; public:

Перегрузка операции сложения в классе - C++
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;iomanip&gt; using namespace std; class Project { private: int id; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
05.09.2012, 20:38     Перегрузка функций в классе #2
Цитата Сообщение от novak Посмотреть сообщение
int b,c,i,q=1,h=1;
вы пробовали переменным дать осмысленные имена? или гадать нужно?
переменная h не инициализирована, что такое zn?
C++
1
2
3
4
long Stack::zn(long h)       //ЗНАЧЕНИЕ СТОКОВОЕ
{h=1;
return (data[h]);
}
зачем тогда тут long h, если он у вас там равен 1 ??
некоторые переменные не используются.
novak
2 / 2 / 0
Регистрация: 14.04.2011
Сообщений: 141
05.09.2012, 22:05  [ТС]     Перегрузка функций в классе #3
Я специально упростил программу донельзя, чтобы ее проще понять было. Несколько функций вообще выбросил. Поэтому, например, индекс h, вместо многочисленный операций я просто приравнял единице.
Цитата Сообщение от panicwassano Посмотреть сообщение
некоторые переменные не используются.
Все переменные используются до единой, просто после упрощения программы не совсем ясно истинное их назначение.
Могу выкинуть еще функции void push() и void pop() (вернее заменить их одной очень простой) если таки логика проги не ясна.
В любом случае вопрос остается открытым насчет функций:
C++
1
2
3
4
int Stack::zn(int b)          //ЗНАЧЕНИЕ НА ВЕРШИНЕ СТЕКА
{
return (data[--b]);
}
и

C++
1
2
3
4
long Stack::zn(long)       //ЗНАЧЕНИЕ СТОКОВОЕ
{
return (data[1]);
}
что неправильно в их записи, почему прога не выдает стоковое и топовое значения?
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
05.09.2012, 22:09     Перегрузка функций в классе #4
вопрос почему она должна выдавать правильное значение, что есть b? я вам уже написал, дайте переменным осмысленные имена, чтобы код можно было прочесть а не гадать
где в классе стека задается вершина? чтобы облегчить себе задачу, я бы создал в классе переменную вершину, которая содержит то самое значение
novak
2 / 2 / 0
Регистрация: 14.04.2011
Сообщений: 141
05.09.2012, 22:14  [ТС]     Перегрузка функций в классе #5
То есть вы хотите сказать, что запись перегруженных функций правильна, а ошибка только в логике программы?
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
05.09.2012, 22:18     Перегрузка функций в классе #6
именно так, разберите свой код и найдете ошибку
DiffEreD
1429 / 766 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
05.09.2012, 22:20     Перегрузка функций в классе #7
novak, вот вам более осмысленное определение стека:
код
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
template <class Type>
class Stack
{
private:
    enum {MAX = 10};    // constant specific to class
    Type items[MAX];    // holds stack items
    int top;            // index for top stack item
public:
    Stack();
    bool isempty();
    bool isfull();
    bool push(const Type & item); // add item to stack
    bool pop(Type & item);        // pop top into item
};
 
template <class Type>
Stack<Type>::Stack()
{
    top = 0;
}
 
template <class Type>
bool Stack<Type>::isempty()
{
    return top == 0;
}
 
template <class Type>
bool Stack<Type>::isfull()
{
    return top == MAX;
}
 
template <class Type>
bool Stack<Type>::push(const Type & item)
{
    if (top < MAX)
    {
        items[top++] = item;
        return true;
    }
    else
        return false;
}
 
template <class Type>
bool Stack<Type>::pop(Type & item)
{
    if (top > 0)
    {
        item = items[--top];
        return true;
    }
    else
        return false; 
}
novak
2 / 2 / 0
Регистрация: 14.04.2011
Сообщений: 141
05.09.2012, 22:49  [ТС]     Перегрузка функций в классе #8
Цитата Сообщение от panicwassano Посмотреть сообщение
где в классе стека задается вершина
После прогонки функций void push() и void pop() переменная b имеет значение последнего индекса массива. Вернее даже на единицу больше. Потому data[--b] должен выдавать значение вершины Стека. Пока я не стал применять перегрузку функций все работало нормально.

Добавлено через 25 минут
Давайте так.
Вот тот же самый алгоритм, где все то же самое и работает без проблем, но здесь функции int zn() (СТОКОВОЕ ЗНАЧЕНИЕ) и int zn1() (ТОПОВОЕ ЗНАЧЕНИЕ) не перегрузочные.
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
#include <iostream>
#include <windows.h>
#include <cmath>
using namespace std;
 
int b,c,i,q=1,h;
class Stack
{
public:
int data[100];
    void push();
    void pop();
    int zn();
    int zn1();
};
void Stack::push()           //ВВЕДЕНИЕ В СТЕК
{
    for (int i=1; q!=0; i++)
    {cin >> data[i];
    q=data[i];
    b=i;}              //нужно чтобы присваивание было именно здесь
}
void Stack::pop()       //ДЕМОНСТРАЦИЯ ДАННЫХ В СТЕКЕ
{
c=b;
for (c--; c!=0; c--)
{cout << data[c] << "\n";}
}
int Stack::zn()       //ЗНАЧЕНИЕ СТОКОВОЕ
{h=1;
return (data[h]);
}
int Stack::zn1()          //ЗНАЧЕНИЕ НА ВЕРШИНЕ СТЕКА
{
return (data[--b]);
}
int main()
{SetConsoleOutputCP(1251);
int b,data[100];
    Stack S;
    cout << "Vvedite dannye v stek\n";
    cout << "Dlia ostanovki vvoda nazmite '0'" << endl;
    S.push();
    cout << "Rezultat:\n";
    S.pop();
    cout << "Stokovoe znachenie:\n"<<S.zn()<<endl;
    cout << "Znachenie na vershine steka:\n"<<S.zn1()<<endl;
 
return 0;
}
Функции в данном алгоритме:
C++
1
2
3
4
int Stack::zn()       //ЗНАЧЕНИЕ СТОКОВОЕ
{h=1;
return (data[h]);
}
и
C++
1
2
3
4
int Stack::zn1()          //ЗНАЧЕНИЕ НА ВЕРШИНЕ СТЕКА
{
return (data[--b]);
}
Функции в алгоритме где они должны быть перегруженными:
C++
1
2
3
4
long Stack::zn(long h)       //ЗНАЧЕНИЕ СТОКОВОЕ
{h=1;
return (data[h]);
}
и
C++
1
2
3
4
int Stack::zn(int b)          //ЗНАЧЕНИЕ НА ВЕРШИНЕ СТЕКА
{
return (data[--b]);
}
...найдите хоть одно отличие...
Фунции записаны также кроме их названия. Так почему же в перегрузочном варианте не работает?
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
05.09.2012, 22:51     Перегрузка функций в классе #9
в чем смысл перегрузки вашей?
novak
2 / 2 / 0
Регистрация: 14.04.2011
Сообщений: 141
05.09.2012, 22:55  [ТС]     Перегрузка функций в классе #10
Смысл в том, что по заданию, которое я выполняю, перегрузка функций обязательно должна присутствовать и выбор пал на эти две самые простые функции.
DiffEreD
1429 / 766 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
05.09.2012, 23:25     Перегрузка функций в классе #11
novak, при таком определении ф-ций:
C++
1
2
3
4
5
6
7
8
9
10
int Stack::zn(int b)          //ЗНАЧЕНИЕ НА ВЕРШИНЕ СТЕКА
{
    cout<<"long Stack::zn(int) called\n";
    return (data[--b]);
}
long Stack::zn(long h)       //ЗНАЧЕНИЕ СТОКОВОЕ
{
    cout<<"long Stack::zn(long) called\n";
    return (data[1]);
}
что б увидеть перегрузку, задайте правильно аргументы функциям:
C++
1
2
cout<<S.zn(1L);
cout<<S.zn(7);
novak
2 / 2 / 0
Регистрация: 14.04.2011
Сообщений: 141
05.09.2012, 23:39  [ТС]     Перегрузка функций в классе #12
Честно скажу, вообще не понял ничего. Что это за аргументы у функций вы написали: 1L и 7 ?
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,738
05.09.2012, 23:42     Перегрузка функций в классе #13
1L -- long
7 -- int
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
05.09.2012, 23:44     Перегрузка функций в классе #14
Цитата Сообщение от novak Посмотреть сообщение
Честно скажу, вообще не понял ничего. Что это за аргументы у функций вы написали: 1L и 7 ?
1L это 1 типа long
а 7 это типа int
прочтите пост выше
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2012, 23:58     Перегрузка функций в классе
Еще ссылки по теме:

Сложение строк, перегрузка + в классе - C++
Есть вот класс String как мне перегрузить + что бы я мог использовать так a = &quot;Hello&quot;+ b; тоисть мне объекту b нужно сложить со строкой...

Перегрузка оператора ==, в классе Матрица - C++
#ifndef MATRIX_H #define MATRIX_H template &lt;class T&gt; class Matrix { public: Matrix(int Rows, int Cols); ~Matrix(); ...

Перегрузка fstream в дочернем классе - C++
h class Child:public StudentsBD{ friend fstream &amp;operator&lt;&lt;( fstream&amp; , string &amp; ); friend fstream &amp;operator&gt;&gt;( fstream&amp; , string...

Перегрузка бинарного оператора << в template классе - C++
Помогите пожалйста люди! не получается перегрузить оператор &gt;&gt; и &lt;&lt; в шаблонном классе выдает ошибку: error C2804: бинарный 'operator...

Перегрузка ввода и вывода в классе матриц - C++
Пишу класс матриц, перегрузил ввод и вывод, ввод почему-то не работает. Вот код #include&lt;iostream&gt; #include&lt;vector&gt; using...


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

Или воспользуйтесь поиском по форуму:
novak
2 / 2 / 0
Регистрация: 14.04.2011
Сообщений: 141
05.09.2012, 23:58  [ТС]     Перегрузка функций в классе #15
Ага! Все работает! Всем за помощь большое сенкью вери мач!
Yandex
Объявления
05.09.2012, 23:58     Перегрузка функций в классе
Ответ Создать тему
Опции темы

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