полиморфизм подтипов в С++

У меня есть эта программа на С++.

ссылка2.ч :

#ifndef REF2_H
#define REF2_H
#include <iostream>
using std::cout;
using std::endl;

int   add_int_int(int a, int b) {return (a+b);}

class IntClass;

class Number {
    public:

        //return a Number object that's the results of x+this, when x is IntClass
        virtual Number& addInt(IntClass& x) = 0;

        //Print the number stored in the object
        virtual void print_number() = 0;
    }

class IntClass : public Number {

    private:
        int my_number;

    public:
        //Constructor
        IntClass(int n):my_number(n) {}

        //returns the number stored in the object
        int get_number()  {return my_number;}

        //print the number stored in the object
        void print_number() {cout << my_number << endl;}

        Number& addInt(IntClass& x);
    }

Number& IntClass::addInt(IntClass& x)
{
    int n = add_int_int(my_number, x.get_number());
    IntClass elem = IntClass(n);
    IntClass &ref = elem;
    return ref;     
}

#endif

test.cpp

#include "ref2.h"
#include <iostream>
using std::cout;
using std::endl;


int main() {    
    cout << "Testing subtyping polymorphism:" << endl;
    IntClass ia(1);
    IntClass ib(2);
    Number& num = ia.addInt(ib);     num.print_number();  //should be: 3
}

Я не нахожу свою ошибку. Если кто-нибудь может мне помочь?


person tech-ref    schedule 06.01.2011    source источник
comment
Урок на сегодня: включите свои предупреждения! :)   -  person Kos    schedule 07.01.2011
comment
Вы должны опубликовать ошибки компилятора или вывод программы и ожидаемый результат, если вы считаете, что что-то не так, а не только код.   -  person mgiuca    schedule 07.01.2011
comment
@Fal @mgi Прокомментируйте последнюю строку в main.   -  person GManNickG    schedule 07.01.2011
comment
@GMan: Да, я вижу ожидаемый результат. Но это только малая часть хорошего вопроса.   -  person Ben Voigt    schedule 07.01.2011


Ответы (3)


Вы возвращаете ссылку на локальную переменную в addInt(). Не делай этого. Компилятор должен был предупредить вас об этом.

person Macke    schedule 06.01.2011
comment
Я думаю, что он ввел локальную ссылку, чтобы обойти (правильное) предупреждение компилятора. - person Ben Voigt; 07.01.2011
comment
@Ben: Это действительно похоже на это. И он укусил его в задницу тоже! ;) - person Macke; 07.01.2011

Вы возвращаете ссылку на локальный объект, который выходит за рамки, когда addInt() возвращает:

IntClass elem = IntClass(n);
IntClass &ref = elem;
return ref;    
person Michael Burr    schedule 06.01.2011

Концепция возврата ссылки на число (в данном случае) ошибочна. Думайте о ссылке как об указателе. Функция IntClass::addInt размещает новый объект IntClass в стеке, а затем возвращает ссылку на него.

Когда функция возвращается, память для IntClass освобождается, поэтому ссылка указывает на мусор.

Вы должны вернуть указатель на число (Number*), и вам нужно будет использовать new IntClass для его создания. Затем вам также нужно будет вызвать delete, когда вы закончите его использовать.

person mgiuca    schedule 06.01.2011