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

как правильно вернуть значение? - C++

Восстановить пароль Регистрация
 
Praud
7 / 7 / 3
Регистрация: 25.02.2013
Сообщений: 233
09.03.2014, 19:08     как правильно вернуть значение? #1
C++
1
2
3
4
5
6
7
8
9
10
class Stack
{
private:
    myString *st;
...
 
myString getSt()
{
       return st; // не работает
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fishec
 Аватар для fishec
118 / 118 / 30
Регистрация: 07.09.2013
Сообщений: 337
09.03.2014, 19:19     как правильно вернуть значение? #2
А что в myString? Вообще, либо
C++
1
2
3
4
myString getSt()
{
       return *st;
}
либо
C++
1
2
3
4
myString* getSt()
{
       return st;
}
Extrim88
 Аватар для Extrim88
50 / 50 / 11
Регистрация: 08.02.2013
Сообщений: 189
09.03.2014, 19:21     как правильно вернуть значение? #3
C++
1
2
3
4
myString* Stack::getSt()
{
       return st;
}
Bino321
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 31
09.03.2014, 19:21     как правильно вернуть значение? #4
C++
1
myString *st;
Ну если st указатель, то возвращать наверно нужно так
C++
1
return *st;
Надо же не значение указателя вернуть, а то куда он указывает
Praud
7 / 7 / 3
Регистрация: 25.02.2013
Сообщений: 233
09.03.2014, 19:28  [ТС]     как правильно вернуть значение? #5
Все, вернул как надо. Теперь ошибок компиляции нет, но проблема появилась другая.
Это мне нужно было для конструктора копирования стека.

C++
1
2
3
4
5
6
7
Stack::Stack(Stack &a)
{
    st = new myString[size]; // выделить память под новый стек
    index = a.getIndex();
    for(int i = 0; i < index; i++)
        st[i] = a.getSt()[i];
}
C++
1
2
3
4
5
6
7
Stack stack(n);
for (int i = 0; i < n; i++)
        cout<<stack.print();
 
    Stack stack2(stack);
        for (int i = 0; i < n; i++)
            cout<<stack2.print();
Теперь первый стек выводит, а дальше краш программы. Пишет "Invalid allocation size "число bytes"
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
09.03.2014, 21:14     как правильно вернуть значение? #6
Цитата Сообщение от Praud Посмотреть сообщение
C++
1
2
3
Stack::Stack(Stack &a)
{
    st = new myString[size]; // выделить память под новый стек
Откуда этот size?
fishec
 Аватар для fishec
118 / 118 / 30
Регистрация: 07.09.2013
Сообщений: 337
09.03.2014, 21:48     как правильно вернуть значение? #7
Цитата Сообщение от Somebody Посмотреть сообщение
Откуда этот size?
Мб так
C++
1
st = new myString[a.size];
Praud
7 / 7 / 3
Регистрация: 25.02.2013
Сообщений: 233
10.03.2014, 01:16  [ТС]     как правильно вернуть значение? #8
выводит мусор и крашится...
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2014, 06:49     как правильно вернуть значение? #9
Цитата Сообщение от Praud Посмотреть сообщение
выводит мусор и крашится...
Кода больше давайте.
Praud
7 / 7 / 3
Регистрация: 25.02.2013
Сообщений: 233
10.03.2014, 13:02  [ТС]     как правильно вернуть значение? #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Stack
{
private:
    myString *st;
    int size;
    int index;
 
    
public:
    Stack(int);
    Stack(Stack&);
    ~Stack(void);
    int getSize();
    int getIndex();
    myString* getSt();
    friend void operator+(Stack&, myString);
    myString print(void);
    myString operator[](int);
};
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
Stack::Stack(int k)
{
    size=k;
    st=new myString[size];
    index=0;
}
 
Stack::Stack(Stack &a)
{
    st = new myString[a.size]; 
    index = a.getIndex();
    for(int i = 0; i < index; i++)
        st[i] = a.getSt()[i];
}
 
int Stack::getSize()
{
    return size;
}
 
int Stack::getIndex()
{
    return index;
}
 
myString* Stack::getSt()
{
    return st;
}
 
Stack::~Stack(void)
{
    delete [] st;
}
 
void operator+(Stack& b, myString a)
{
    if(b.index==b.size)
             cout << "Стек полон!" << endl;
      else b.st[b.index++] = a;
 
}
 
myString Stack::print(void)
{
     if (index < 0)
     {
        cout << "Стек не загружен!" << endl;
        return 0;
     } 
     else return st[--index];
}
 
myString Stack::operator[](int a)
{
    if(a<size)
        return st[a];
    else 
    {
        cerr<<"Error!";
        _getch();
        exit(-1);
    }
}
Добавлено через 1 минуту
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
int main()
{
    int n;
    cout<<"Enter the stack size: ";
    cin>>n;
    Stack stack(n);
 
    myString string;
    cin>>string;
    
    for(int i=0;i<n;i++)
    {
        cin>>string;
        stack+string;
    }
 
    for (int i = 0; i < n; i++)
        cout<<stack.print();
 
    Stack stack2(stack);
        for (int i = 0; i < n; i++)
        {
            cout<<stack2.print();
            getch();
        }
 
    _getch();
}
Добавлено через 1 час 13 минут
Вот еще класс MyString. Может там проблема кроется

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
const int MAX_SIZE = 255;
 
class myString
{
private:
    char str[MAX_SIZE];
public:
    myString(void);
    myString(char*);
    ~myString(void);
    myString operator+(myString);
    myString operator+(char);
    char operator[](int);
    void operator=(char*);
    void operator=(myString);
    void Addition(myString);
    friend ostream& operator<<(ostream&,const myString&);
    friend istream& operator>>(istream&, myString&);
};
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
#include "myString.h"
#include "string.h"
#include "conio.h"
#include <iostream>
 
myString::myString(void)
{
    strcpy(str, "");
}
 
myString::myString(char* s)
{
    strcpy(str, s);
}
 
myString::~myString(void)
{
}
 
myString myString::operator+(myString s)
{
    Addition(s);
 
    return str;
}
 
myString myString::operator+(char s)
{
    str[strlen(str)+1]='\0';
    str[strlen(str)]=s;
    
    return str;
}
 
void myString::operator=(char *s)
{
    strcpy(str, s);
}
 
void myString::operator=(myString s)
{
    Addition(s);
}
 
ostream& operator<<(ostream& os,const myString& ms)
{
     os<<ms.str<<endl;
     return os;
}
 
istream& operator>>(istream& os, myString& ms)
{
    char BUFF[2048];
 
    os.getline(BUFF, sizeof BUFF);
    ms = BUFF;
 
    return os;
}
 
 
char myString::operator[](int i)
{
    if(strlen(str)>i)
        return str[i];
    else 
        {
            cerr<<"Error!";
            _getch();
            exit(-1);
        }
}
 
void myString::Addition(myString s)
{
    int len=strlen(str);
    int i=0;
    int k=0;
    for(i=len;i<len+strlen(s.str);i++)
    {
        str[i]=s.str[k];
        k++;
    }
 
    str[i]='\0';
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2014, 21:15     как правильно вернуть значение?
Еще ссылки по теме:

C++ Как вернуть из моей функции значение реестра?
Pthread.h, как вернуть из потоковой функции значение типа double? C++
C++ Функции, как вернуть значение?

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2014, 21:15     как правильно вернуть значение? #11
В main() этот ввод зачем сделан?
C++
1
2
myString string;
cin>>string;
Добавлено через 18 минут
При копировании size не копируете, при выводе первого стека (print) уменьшаете index до 0, потом этим стеком ининиализируете (через копирование) второй:
C++
1
Stack stack2(stack);
При копировании данных в новую строку используется значение index (оно, после вывода равно 0, значит строка будет неинициализирована):
C++
1
2
3
4
5
6
7
Stack::Stack(Stack &a)
{
    st = new myString[a.size]; 
    index = a.getIndex();
    for(int i = 0; i < index; i++)
        st[i] = a.getSt()[i];
}
Добавлено через 14 минут
C++
1
2
3
4
5
6
7
8
Stack::Stack(Stack &a)
{
    size = a.size;
    st = new myString[a.size]; 
    index = a.getIndex();
    for(int i = 0; i < index; i++)
        st[i] = a.getSt()[i];
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
myString Stack::print(void)
{
     if (index == 0)
     {
        cout << "Стек не загружен!" << endl;
        return 0;
     } 
     else
     {
         for (int i = 0; i < index; i++)
            cout << st[i];
     }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main()
{
    int n;
    cout<<"Enter the stack size: ";
    (cin>>n).get();
    Stack stack(n);
    
    myString string;
    
    for(int i=0;i<n;i++)
    {
        cin >> string;
        stack + string;
    }
    
    stack.print();
 
    Stack stack2(stack);
        
    stack2.print();
    
    getch();
}
Yandex
Объявления
10.03.2014, 21:15     как правильно вернуть значение?
Ответ Создать тему
Опции темы

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