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

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

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

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

05.09.2012, 19:09. Просмотров 1090. Ответов 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)- являются перегруженными. Они должны выводить на экран соответственно топовое и стоковое значения, но этого не происходит. Вот в этом и загвоздка. Пожалуйста, подскажите что не так в листинге.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2012, 19:09
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Перегрузка функций в классе (C++):

Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов - C++
Здравствуйте!!! Я бы хотел попросить помоч решить...ну или скинуть примеры таких задач, если вдруг у вас они завалялись на компе или...

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

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

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

14
panicwassano
594 / 562 / 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 ??
некоторые переменные не используются.
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]);
}
что неправильно в их записи, почему прога не выдает стоковое и топовое значения?
0
panicwassano
594 / 562 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
05.09.2012, 22:09 #4
вопрос почему она должна выдавать правильное значение, что есть b? я вам уже написал, дайте переменным осмысленные имена, чтобы код можно было прочесть а не гадать
где в классе стека задается вершина? чтобы облегчить себе задачу, я бы создал в классе переменную вершину, которая содержит то самое значение
1
novak
2 / 2 / 0
Регистрация: 14.04.2011
Сообщений: 141
05.09.2012, 22:14  [ТС] #5
То есть вы хотите сказать, что запись перегруженных функций правильна, а ошибка только в логике программы?
0
panicwassano
594 / 562 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
05.09.2012, 22:18 #6
именно так, разберите свой код и найдете ошибку
0
DiffEreD
1439 / 776 / 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; 
}
1
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]);
}
...найдите хоть одно отличие...
Фунции записаны также кроме их названия. Так почему же в перегрузочном варианте не работает?
0
panicwassano
594 / 562 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
05.09.2012, 22:51 #9
в чем смысл перегрузки вашей?
1
novak
2 / 2 / 0
Регистрация: 14.04.2011
Сообщений: 141
05.09.2012, 22:55  [ТС] #10
Смысл в том, что по заданию, которое я выполняю, перегрузка функций обязательно должна присутствовать и выбор пал на эти две самые простые функции.
0
DiffEreD
1439 / 776 / 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);
1
novak
2 / 2 / 0
Регистрация: 14.04.2011
Сообщений: 141
05.09.2012, 23:39  [ТС] #12
Честно скажу, вообще не понял ничего. Что это за аргументы у функций вы написали: 1L и 7 ?
0
ValeryS
Модератор
6962 / 5299 / 522
Регистрация: 14.02.2011
Сообщений: 17,872
05.09.2012, 23:42 #13
1L -- long
7 -- int
1
panicwassano
594 / 562 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
05.09.2012, 23:44 #14
Цитата Сообщение от novak Посмотреть сообщение
Честно скажу, вообще не понял ничего. Что это за аргументы у функций вы написали: 1L и 7 ?
1L это 1 типа long
а 7 это типа int
прочтите пост выше
1
novak
2 / 2 / 0
Регистрация: 14.04.2011
Сообщений: 141
05.09.2012, 23:58  [ТС] #15
Ага! Все работает! Всем за помощь большое сенкью вери мач!
0
05.09.2012, 23:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2012, 23:58
Привет! Вот еще темы с ответами:

Перегрузка операторов в классе - 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; ...

Сложение строк, перегрузка + в классе - 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(); ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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