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

Возвращение значения в классе - C++

Восстановить пароль Регистрация
 
novak
2 / 2 / 0
Регистрация: 14.04.2011
Сообщений: 141
14.11.2011, 19:17     Возвращение значения в классе #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
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
87
#include <iostream>
#include <cmath>
using namespace std;
 
class Matrix
{
 private:
    int n; // порядок матрицы
    int *data; // указатель на массив
 public:
    Matrix(int an = 1);
    ~Matrix();
    int find();
    void print();
    void input();
 
};
 
Matrix::Matrix(int an /* = 1 */)
{
    data = new int[an*an];
    n = an;
    for (int i=0; i< n; i++)
        for (int j=0; j< n; j++)
         data[i * n + j] = 0;
}
 
Matrix::~Matrix()
{
    delete [] data;
}
 
void Matrix::print()
{
    for (int i=0; i< n; i++)
    {
        for (int j=0; j< n; j++)
           cout << data[i * n + j] << " ";
        cout << endl;
    }
}
 
void Matrix::input()
{
    for (int i=0; i< n; i++)
        for (int j=0; j< n; j++)
          cin >> data[i * n + j];
}
 
int Matrix::find()
{
int b,c,min,nst,nstr,nstr1=0,nst1=0,e,flag;
for(b=0;b<n;b++)     //АНАЛИЗ ДАННЫХ МАТРИЦЫ
{
flag=0;
min=data[n*b];
nst=0;
nstr=0;
for(c=0;c<n;c++)     
{
if(data[b*n+c]<=min)
{min=data[b*n+c];
nst=c;             
nstr=b;}           
}
for(e=0;e<n;e++)   /
{if(data[nst+n*e]>min)  
flag=1;}           
if(flag==0)         /
{nstr1=nstr+1;       
nst1=nst+1;}
}
return nst1;
return nstr1;
}
 
int main()
{
    SetConsoleOutputCP(1251);
    Matrix M(2);
    cout << "Vvod matrix" << endl;
    M.input();
    cout << "Matrix:" << endl;
    M.print();
    cout << "Nomer stroki= " << M.find() <<endl;
    return 0;
}
В строках 73,74 нужно вернуть два значения nst1 и nstr1 в основную программу, чтобы строка 85 выводила оба этих значения. Но получается выводить только одно значение. Как сделать чтобы выходило оба значения?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2011, 19:17     Возвращение значения в классе
Посмотрите здесь:

C++ Возвращение из функции значения
Про возвращение значения... C++
C++ Про возвращение значения 2...
возвращение ненулевого значения C++
Возвращение значения из функции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
14.11.2011, 19:18     Возвращение значения в классе #2
В каких строках?!!!
Xind
275 / 148 / 7
Регистрация: 05.11.2011
Сообщений: 425
Записей в блоге: 1
14.11.2011, 19:20     Возвращение значения в классе #3
Цитата Сообщение от novak Посмотреть сообщение
return nst1; return nstr1;
Все правильно. Он будет выводить только nst1 и покинет подпрограмму.

Цитата Сообщение от novak Посмотреть сообщение
Как сделать чтобы выходило оба значения?
Сделать возврат с помощью массива.
novak
2 / 2 / 0
Регистрация: 14.04.2011
Сообщений: 141
14.11.2011, 19:30  [ТС]     Возвращение значения в классе #4
Цитата Сообщение от Xind Посмотреть сообщение
Сделать возврат с помощью массива.
А по проще никак нельзя сделать?
Xind
275 / 148 / 7
Регистрация: 05.11.2011
Сообщений: 425
Записей в блоге: 1
14.11.2011, 19:41     Возвращение значения в классе #5
Цитата Сообщение от novak Посмотреть сообщение
А по проще никак нельзя сделать?
через структуру или указатели в параметрах функции.
novak
2 / 2 / 0
Регистрация: 14.04.2011
Сообщений: 141
14.11.2011, 19:47  [ТС]     Возвращение значения в классе #6
Цитата Сообщение от Xind Посмотреть сообщение
через указатели в параметрах функции.
Напишите плиз как конкретно это сделать, а то никак не получается.
Xind
275 / 148 / 7
Регистрация: 05.11.2011
Сообщений: 425
Записей в блоге: 1
14.11.2011, 19:50     Возвращение значения в классе #7
C++
1
2
3
4
struct find_data {
    int nst1;
    int nstr1;
};
В методе Matrix::find() вместо обычного присваивания переменным nst1 и nstr1, создать объект структуры find_data fd; присвоить значения fd.nst1 и fd.nstr1. Затем вернуть return fd;
У метода должен быть следующий вид:
find_data Matrix::find()

Вариант 2. У вас С++. Тогда можно еще через ссылки.
void Matrix::find(int& nst1, int& nstr1);

нужно только убрать возврат и заметить тип возврата.
Dar101
 Аватар для Dar101
40 / 40 / 1
Регистрация: 12.05.2011
Сообщений: 109
14.11.2011, 19:53     Возвращение значения в классе #8
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
87
88
89
90
#include <iostream>
#include <cmath>
using namespace std;
 
class Matrix
{
private:
    int n; // порядок матрицы
    int *data; // указатель на массив
public:
    Matrix(int an = 1);
    ~Matrix();
    int* find();
    void print();
    void input();
 
};
 
Matrix::Matrix(int an /* = 1 */)
{
    data = new int[an*an];
    n = an;
    for (int i=0; i< n; i++)
        for (int j=0; j< n; j++)
            data[i * n + j] = 0;
}
 
Matrix::~Matrix()
{
    delete [] data;
}
 
void Matrix::print()
{
    for (int i=0; i< n; i++)
    {
        for (int j=0; j< n; j++)
            cout << data[i * n + j] << " ";
        cout << endl;
    }
}
 
void Matrix::input()
{
    for (int i=0; i< n; i++)
        for (int j=0; j< n; j++)
            cin >> data[i * n + j];
}
 
int* Matrix::find()
{
    int b,c,min,nst,nstr,nstr1=0,nst1=0,e,flag;
    for(b=0;b<n;b++)     //АНАЛИЗ ДАННЫХ МАТРИЦЫ
    {
        flag=0;
        min=data[n*b];
        nst=0;
        nstr=0;
        for(c=0;c<n;c++)     
        {
            if(data[b*n+c]<=min)
            {min=data[b*n+c];
            nst=c;             
            nstr=b;}           
        }
        for(e=0;e<n;e++)   
        {if(data[nst+n*e]>min)  
        flag=1;}           
        if(flag==0)         
        {nstr1=nstr+1;       
        nst1=nst+1;}
    }
    int ret[2];
    ret[0]=nst1;
    ret[1]=nstr1;
    return ret;
}
 
int main()
{
    Matrix M(2);
    cout << "Vvod matrix" << endl;
    M.input();
    cout << "Matrix:" << endl;
    M.print();
    int *coord = M.find();
    cout << "Nomer stroki= " << coord[0] << " ololo " << coord[1] <<endl;
    system("pause");
    return 0;
}
novak
2 / 2 / 0
Регистрация: 14.04.2011
Сообщений: 141
14.11.2011, 20:14  [ТС]     Возвращение значения в классе #9
Работает. Только компилятор выдает предупреждение:

|54|warning: address of local variable 'ret' returned|
Build finished: 0 errors, 1 warnings
Как это исправить?
Xind
275 / 148 / 7
Регистрация: 05.11.2011
Сообщений: 425
Записей в блоге: 1
14.11.2011, 20:17     Возвращение значения в классе #10
Цитата Сообщение от novak Посмотреть сообщение
Работает. Только компилятор выдает предупреждение:

|54|warning: address of local variable 'ret' returned|
Build finished: 0 errors, 1 warnings
Как это исправить?
Тот пример некорректен, потому что по указателю был возвращен локальный объект, после завершения метода он может быть уничтожен и полученный указатель будет ссылаться на неизвестную область.

Лучше воспользоваться структурами.
Dar101
 Аватар для Dar101
40 / 40 / 1
Регистрация: 12.05.2011
Сообщений: 109
14.11.2011, 20:18     Возвращение значения в классе #11
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
87
88
89
90
91
#include <iostream>
#include <cmath>
using namespace std;
 
class Matrix
{
private:
    int n; // порядок матрицы
    int *data; // указатель на массив
    int ret[2];
public:
    Matrix(int an = 1);
    ~Matrix();
    int* find();
    void print();
    void input();
 
};
 
Matrix::Matrix(int an /* = 1 */)
{
    data = new int[an*an];
    n = an;
    for (int i=0; i< n; i++)
        for (int j=0; j< n; j++)
            data[i * n + j] = 0;
}
 
Matrix::~Matrix()
{
    delete [] data;
}
 
void Matrix::print()
{
    for (int i=0; i< n; i++)
    {
        for (int j=0; j< n; j++)
            cout << data[i * n + j] << " ";
        cout << endl;
    }
}
 
void Matrix::input()
{
    for (int i=0; i< n; i++)
        for (int j=0; j< n; j++)
            cin >> data[i * n + j];
}
 
int* Matrix::find()
{
    int b,c,min,nst,nstr,nstr1=0,nst1=0,e,flag;
    for(b=0;b<n;b++)     //АНАЛИЗ ДАННЫХ МАТРИЦЫ
    {
        flag=0;
        min=data[n*b];
        nst=0;
        nstr=0;
        for(c=0;c<n;c++)     
        {
            if(data[b*n+c]<=min)
            {min=data[b*n+c];
            nst=c;             
            nstr=b;}           
        }
        for(e=0;e<n;e++)   
        {if(data[nst+n*e]>min)  
        flag=1;}           
        if(flag==0)         
        {nstr1=nstr+1;       
        nst1=nst+1;}
    }
    ret[0]=nst1;
    ret[1]=nstr1;
    return ret;
}
 
 
int main()
{
    Matrix M(2);
    cout << "Vvod matrix" << endl;
    M.input();
    cout << "Matrix:" << endl;
    M.print();
    int *coord = M.find();
    cout << "Nomer stroki= " << coord[0] << " ololo " << coord[1] <<endl;
    system("pause");
    return 0;
}
Да, мой косяк. Пример действительно некорректный был.
Сыроежка
Заблокирован
14.11.2011, 20:20     Возвращение значения в классе #12
Цитата Сообщение от novak Посмотреть сообщение
Работает. Только компилятор выдает предупреждение:

|54|warning: address of local variable 'ret' returned|
Build finished: 0 errors, 1 warnings
Как это исправить?
Это не исправимо, так как вам подкинули не корректный код!

Проще объявить структуру и возвращать ее из вашей функции find

C++
1
2
3
4
5
6
7
struct pair
{
   int nst1;
   int mstr1;
};
 
pair Matrix::find() const;
Dar101
 Аватар для Dar101
40 / 40 / 1
Регистрация: 12.05.2011
Сообщений: 109
14.11.2011, 20:21     Возвращение значения в классе #13
Хорошо, что заметили, всем спасибо!
Чем существенно будет отличаться структура от массива?
Возвращаем указатель на начало массива или структуры, мне кажется — в данном примере разницы не будет.
Xind
275 / 148 / 7
Регистрация: 05.11.2011
Сообщений: 425
Записей в блоге: 1
14.11.2011, 20:22     Возвращение значения в классе #14
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
87
88
89
90
91
92
93
94
95
96
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
 
struct find_data {
    int nst1;
    int nstr1;
};
 
class Matrix
{
private:
        int n; // порядок матрицы
        int *data; // указатель на массив
public:
        Matrix(int an = 1);
        ~Matrix();
        find_data find();
        void print();
        void input();
 
};
 
Matrix::Matrix(int an /* = 1 */)
{
        data = new int[an*an];
        n = an;
        for (int i=0; i< n; i++)
                for (int j=0; j< n; j++)
                        data[i * n + j] = 0;
}
 
Matrix::~Matrix()
{
        delete [] data;
}
 
void Matrix::print()
{
        for (int i=0; i< n; i++)
        {
                for (int j=0; j< n; j++)
                        cout << data[i * n + j] << " ";
                cout << endl;
        }
}
 
void Matrix::input()
{
        for (int i=0; i< n; i++)
                for (int j=0; j< n; j++)
                        cin >> data[i * n + j];
}
 
find_data Matrix::find()
{
        int b,c,min,nst,nstr,nstr1=0,nst1=0,e,flag;
        for(b=0;b<n;b++)     //АНАЛИЗ ДАННЫХ МАТРИЦЫ
        {
                flag=0;
                min=data[n*b];
                nst=0;
                nstr=0;
                for(c=0;c<n;c++)     
                {
                        if(data[b*n+c]<=min)
                        {min=data[b*n+c];
                        nst=c;             
                        nstr=b;}           
                }
                for(e=0;e<n;e++)   
                {if(data[nst+n*e]>min)  
                flag=1;}           
                if(flag==0)         
                {nstr1=nstr+1;       
                nst1=nst+1;}
        }
        find_data fd;
        fd.nst1=nst1;
        fd.nstr1=nstr1;
        return fd;
}
 
int main()
{
        Matrix M(2);
        cout << "Vvod matrix" << endl;
        M.input();
        cout << "Matrix:" << endl;
        M.print();
        find_data coord = M.find();
        cout << "Nomer stroki= " << coord.nst1 << " ololo " << coord.nstr1 <<endl;
        system("pause");
        return 0;
}
Сыроежка
Заблокирован
14.11.2011, 20:23     Возвращение значения в классе #15
Цитата Сообщение от Dar101 Посмотреть сообщение
Хорошо, что заметили, всем спасибо!
Чем существенно будет отличаться структура от массива?
Возвращаем указатель на начало массива или структуры, мне кажется — в данном примере разницы не будет.
Структуру можно использовать в качестве возвращаемого значения, а массив нельзя возвращать из функции.
При этом структура возвращается по значению, то есть вы можете в вызывающей функции присвоить ее другой структуре, а если использовать в качестве возвращаемого значения указатель на первый элемент локального массива, то он не будет действительным. так как локальный массив будет удален.
Dar101
 Аватар для Dar101
40 / 40 / 1
Регистрация: 12.05.2011
Сообщений: 109
14.11.2011, 20:28     Возвращение значения в классе #16
С локальным массивом я ошибся — согласен.
А по поводу моего последнего кода — можно так возвращать значения? Хотя бы теоретически, про лучший способ я понял.
__________
Я так думаю могут проблемы возникнуть, если потом эти внутренние переменные класса будут захвачены другими функциями и изменятся. Там ведь просто адрес передаётся. Вроде разобрался.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2011, 20:42     Возвращение значения в классе
Еще ссылки по теме:

Возвращение значения функции C++
Возвращение значения функции C++
Возвращение значения функции C++

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

Или воспользуйтесь поиском по форуму:
novak
2 / 2 / 0
Регистрация: 14.04.2011
Сообщений: 141
14.11.2011, 20:42  [ТС]     Возвращение значения в классе #17
Всем спасибо за помощь.
Но мне нужно еще одно серьезное дополнение в этой программе.
Нужно чтобы пользователь задавал размерность матрицы и для этого надо массив разместить в динамической памяти. Подскжите как это сделать?
Yandex
Объявления
14.11.2011, 20:42     Возвращение значения в классе
Ответ Создать тему
Опции темы

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