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

Ссылки - C++

Восстановить пароль Регистрация
 
Lotles
 Аватар для Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
08.10.2010, 20:08     Ссылки #1
Hi all
Нельзя возвращать ссылку, если возвращаемое значение является локальной переменоой как здесь, потому что локальные переменные уничтожаются после выхода из функции
Код:


C++
1
2
3
4
5
6
7
8
9
Fraction& Fraction::add(Fraction other) {
        Fraction fract;
    int lcd = lcm(den, other.den);
    int quot1 = lcd/den;
    int quot2 = lcd/other.den;
    fract.set(num * quot1 + other.num * quot2, lcd);
    fract.normalize();
    return fract;
}
Вот весь код, где возвращается ссылка из локальной переменной:
Код:


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
#include "stdafx.h"
#include "conio.h"
using namespace std;
class Fraction {
private:
    int num, den;   
public:
    Fraction() {num = 0; den = 0; normalize();} 
    Fraction(int n, int d) {set(n, d);}
 
    void set(int n, int d) {num = n; den = d; normalize();}
    int get_num()  {return num;}
    int get_den()  {return den;}
    Fraction add(Fraction other);
    Fraction mult(Fraction other);
private:
    void normalize(); 
    int gcf(int a, int b);     
    int lcm(int a, int b);    
};
int main(){
    Fraction f1, f2;
    Fraction f3(1, 2);
 
    cout << "The value of f1 is ";
    cout << f1.get_num() << "/";
    cout << f1.get_den() << endl;
 
    cout << "The value of f3 is ";
    cout << f3.get_num() << "/";
    cout << f3.get_den() << endl;
    return 0;
}
void Fraction::normalize(){
    if (den == 0 || num == 0) {
        num = 0;
        den = 1;
    }
 
    if (den < 0) {
        num *= -1;
        den *= -1;
    }
 
    int n = gcf(num, den);
    num = num / n;
    den = den / n;
}
int Fraction::gcf(int a, int b) {
    if (a % b == 0)
        return abs(b);
    else
        return gcf(b, a % b);
}
int Fraction::lcm(int a, int b){
    return (a / gcf(a, b)) * b;
}
Fraction& Fraction::add(Fraction other) {
        Fraction fract;
    int lcd = lcm(den, other.den);
    int quot1 = lcd/den;
    int quot2 = lcd/other.den;
    fract.set(num * quot1 + other.num * quot2, lcd);
    fract.normalize();
    return fract;
}
А если эту переменную Fraction fract; объявить глобально ?
Почему так нельзя?
Вот код, где возвращается ссылка для глобальной переменной
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
#include "stdafx.h"
#include "conio.h"
using namespace std;
class Fraction {
private:
    int num, den;   
public:
    Fraction() {num = 0; den = 0; normalize();} 
    Fraction(int n, int d) {set(n, d);}
 
    void set(int n, int d) {num = n; den = d; normalize();}
    int get_num()  {return num;}
    int get_den()  {return den;}
    Fraction add(Fraction other);
    Fraction mult(Fraction other);
private:
    void normalize(); 
    int gcf(int a, int b);     
    int lcm(int a, int b);    
};
        Fraction fract;
int main(){
    Fraction f1, f2;
    Fraction f3(1, 2);
 
    cout << "The value of f1 is ";
    cout << f1.get_num() << "/";
    cout << f1.get_den() << endl;
 
    cout << "The value of f3 is ";
    cout << f3.get_num() << "/";
    cout << f3.get_den() << endl;
    return 0;
}
void Fraction::normalize(){
    if (den == 0 || num == 0) {
        num = 0;
        den = 1;
    }
 
    if (den < 0) {
        num *= -1;
        den *= -1;
    }
 
    int n = gcf(num, den);
    num = num / n;
    den = den / n;
}
int Fraction::gcf(int a, int b) {
    if (a % b == 0)
        return abs(b);
    else
        return gcf(b, a % b);
}
int Fraction::lcm(int a, int b){
    return (a / gcf(a, b)) * b;
}
Fraction& Fraction::add(Fraction other) {
    int lcd = lcm(den, other.den);
    int quot1 = lcd/den;
    int quot2 = lcd/other.den;
    fract.set(num * quot1 + other.num * quot2, lcd);
    fract.normalize();
    return fract;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.10.2010, 20:08     Ссылки
Посмотрите здесь:

C++ Ссылки в С++
Ссылки C++
C++ Ссылки и указатели
C++ ссылки
C++ ссылки
Инкремент ссылки C++
Ссылки в С++ C++
C++ Ссылки

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nwq
33 / 33 / 2
Регистрация: 24.09.2010
Сообщений: 140
08.10.2010, 21:21     Ссылки #2
Так можно, ошибка в том что объявление функции add отличается от её определения.
Lotles
 Аватар для Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
08.10.2010, 22:07  [ТС]     Ссылки #3
Ха
Просто привык объявление и определение функции писать вместе, а тут так не прокатило, поэтому в определении функции забыл добавить ссылку
Yandex
Объявления
08.10.2010, 22:07     Ссылки
Ответ Создать тему
Опции темы

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