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

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

Войти
Регистрация
Восстановить пароль
 
Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
#1

Ссылки - C++

08.10.2010, 20:08. Просмотров 401. Ответов 2
Метки нет (Все метки)

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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.10.2010, 20:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ссылки (C++):

Зачем нужны rvalue ссылки, если есть универсальные ссылки - C++
Читаю книгу Скотта Мэйерса... Что-то я совсем запутался с этими rvalue ссылками. Я не пойму, зачем нужны rvalue ссылки, если есть...

Ссылки - C++
Хотел бы узнать как функция Struk &amp; Function() возвращает значения например что бы код весь не писать скажу что объявлен класс struk...

ссылки - C++
скиньте плиз несколько интерестных ссылок типа таких: http://www.firststeps.ru/mfc/winapi/winapi1.html уроки, примеры Добавлено...

Ссылки в С++ - C++
void swap(int&amp; i, int&amp; j) { int tmp = i; i = j; j = tmp; } int main() { int x, y;

Ссылки - C++
Здравствуйте. Если я задаю матрицу int **m=new int*; for (int i=0;i&lt;h;i++) m=new int; то могу ли я обращаться и...

ссылки - C++
как здесь привести к интовому виду,чтобы выдавало 100? # include &lt;iostream&gt; using namespace std; void f(int &amp;i) { i = 100;...

2
Nwq
33 / 33 / 2
Регистрация: 24.09.2010
Сообщений: 140
08.10.2010, 21:21 #2
Так можно, ошибка в том что объявление функции add отличается от её определения.
1
Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
08.10.2010, 22:07  [ТС] #3
Ха
Просто привык объявление и определение функции писать вместе, а тут так не прокатило, поэтому в определении функции забыл добавить ссылку
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2010, 22:07
Привет! Вот еще темы с ответами:

Ссылки - C++
Для меня вроде понятно что означает конструкция int* a; создается указатель на целую переменную. А что означает конструкция int&amp;...

Возврат ссылки - C++
int &amp; function(int); Понятно для чего передают аргументы в функцию как указатели или ссылки.Но зачем функция возвращает ссылку? Чтобы...

Указатели и ссылки - C++
Экспериментируя с указателями пришел к вот таким выводам: int a; //переменная int *b; //указатель int &amp;c = a //ссылка на &lt;a&gt; ...

Указатели и ссылки - C++
Допустим, что есть функция, в которую мы кидаем массив по указателю и кол-ву элементов. void printArray(int *arr, int elements) ...


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

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

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