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

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

Восстановить пароль Регистрация
 
novak
2 / 2 / 0
Регистрация: 14.04.2011
Сообщений: 141
05.09.2012, 19:09     Перегрузка функций в классе #1
Дано задание: 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++
C++ Перегрузка оператора ==, в классе Матрица
C++ Перегрузка операторов в классе
C++ Перегрузка операторов в классе
C++ Перегрузка операции < в классе
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
 Аватар для DiffEreD
1420 / 757 / 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
 Аватар для DiffEreD
1420 / 757 / 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
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
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++ Перегрузка fstream в дочернем классе
Перегрузка оператора '=' в классе C++
Перегрузка в классе C++

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

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

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