7 / 7 / 9
Регистрация: 25.02.2013
Сообщений: 237
1

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

09.03.2014, 19:08. Показов 844. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
class Stack
{
private:
    myString *st;
...
 
myString getSt()
{
       return st; // не работает
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.03.2014, 19:08
Ответы с готовыми решениями:

Как правильно вернуть итератор из метода
Всем привет. Есть класс обертка над контейнером, который рулит некоторыми сущностями И...

Как правильно вернуть wchar_t из функции
Я написал функцию, она формирует строку wchar_t вида "16-9-2015-10-12-51.txt"...

Как правильно вернуть объект созданный в функции?
Допустим у нас есть функция, которая динамически создает объект и должна его вернуть. К примеру,...

как вернуть значение?
Здравствуйте не могу сделать, не знаю как! #include <iostream> #include <iomanip> #include...

10
126 / 125 / 62
Регистрация: 07.09.2013
Сообщений: 343
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;
}
0
51 / 51 / 21
Регистрация: 08.02.2013
Сообщений: 189
09.03.2014, 19:21 3
C++
1
2
3
4
myString* Stack::getSt()
{
       return st;
}
0
13 / 11 / 3
Регистрация: 22.11.2013
Сообщений: 127
09.03.2014, 19:21 4
C++
1
myString *st;
Ну если st указатель, то возвращать наверно нужно так
C++
1
return *st;
Надо же не значение указателя вернуть, а то куда он указывает
0
7 / 7 / 9
Регистрация: 25.02.2013
Сообщений: 237
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"
0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
09.03.2014, 21:14 6
Цитата Сообщение от Praud Посмотреть сообщение
C++
1
2
3
Stack::Stack(Stack &a)
{
    st = new myString[size]; // выделить память под новый стек
Откуда этот size?
0
126 / 125 / 62
Регистрация: 07.09.2013
Сообщений: 343
09.03.2014, 21:48 7
Цитата Сообщение от Somebody Посмотреть сообщение
Откуда этот size?
Мб так
C++
1
st = new myString[a.size];
0
7 / 7 / 9
Регистрация: 25.02.2013
Сообщений: 237
10.03.2014, 01:16  [ТС] 8
выводит мусор и крашится...
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2014, 06:49 9
Цитата Сообщение от Praud Посмотреть сообщение
выводит мусор и крашится...
Кода больше давайте.
0
7 / 7 / 9
Регистрация: 25.02.2013
Сообщений: 237
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';
}
0
5498 / 4893 / 831
Регистрация: 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();
}
0
10.03.2014, 21:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.03.2014, 21:15
Помогаю со студенческими работами здесь

Как вернуть значение функции в С++
Помогите с задачей

Как вернуть значение лямбды?
int someFunc() { return () -&gt; int {return 1;}; // не работает. Как возвращать такие штуки? }

Как вернуть значение из макроса?
Как сделать стобы из макроса возвращалось значение? #include &quot;stdio.h&quot; int main(void) { ...

Функции, как вернуть значение?
Нужно вернуть значение sum и min и вывести их main.cpp Но компилятор пишет, что: &quot;Ошибка :...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru