2011-01-06 16 views
0

私はこのプログラムをC++に持っています。サブタイプの多型をC++で

ref2.h:

#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 
} 

私は私のミスを見つけることができません。 誰かが私を助けることができれば?

IntClass elem = IntClass(n); 
IntClass &ref = elem; 
return ref;  
+0

今日のレッスン:あなたの警告を有効にしてください! :) – Kos

+2

どのような間違い? – Falmarri

+1

コードだけでなく、何か問題があると思われる場合は、コンパイルエラーまたはプログラムの出力と予想される出力をポストする必要があります。 – mgiuca

答えて

1

あなたはaddInt()リターンが時にスコープから外れローカルオブジェクトへの参照を返します。それをしないでください。コンパイラはそれについて警告していたはずです。

3

あなたは()いるAddInt内のローカル変数への参照を返している:

+1

+1 "Do not do"の正確なフレーズ。 –

+0

私は彼が(正しい)コンパイラ警告を打ち負かすためにローカルリファレンスを導入したと思います。 –

+0

@Ben:それは確かにそれのように見えます。そしてそれはあまりにも彼のお尻でビット! ;) – Macke

1

Numberへの参照を返すという概念は(この場合)脆弱です。ポインタのような参照を考えてください。関数IntClass :: addIntは、新しいIntClassオブジェクトをスタックに割り当ててから、それへの参照を返します。

関数が返ってくると、IntClassのメモリが解放されるため、参照はガベージを指しています。

番号(番号*)へのポインタを返す必要があります。作成するにはnew IntClassを使用する必要があります。その後、使用終了時にdeleteに電話する必要があります。