2015-07-11 72 views
3

我試圖爲變量值編寫接口。基類僅提供一個enum字段,其​​中存儲變量的類型(如int,char等)和一些虛擬函數。 繼承此接口的類應該分別實現變量類型的表示。參考和指向接口的指針之間的C++不同行爲

#include <iostream> 

enum Type 
{ 
    INT, CHAR 
}; 

class Var 
{ 
    Type type; 
public: 
    Var(Type t): 
     type(t) 
    {} 
    virtual void printValue() 
    { 
     std::cout << "-\n"; 
    } 
    virtual void printType() 
    { 
     std::cout << type << std::endl; 
    } 
}; 

class IntVar : public Var 
{ 
    int value; 
public: 
    IntVar(int i): 
     Var(INT), 
     value(i) 
    {} 
    void printValue() 
    { 
     std::cout << value << std::endl; 
    } 
}; 

class CharVar : public Var 
{ 
    char value; 
public: 
    CharVar(char c): 
     Var(CHAR), 
     value(c) 
    {} 
    void printValue() 
    { 
     std::cout << value << std::endl; 
    } 
}; 

然後我試圖這樣:

Var* np = new IntVar(1); 

np->printType(); 
np->printValue(); 
np = new CharVar('a'); 
np->printType(); 
np->printValue(); 

輸出是

0(類型:: INT),1,1(類型:: CHAR),一個

所以一切都按預期工作,但是當我用相同的參考文獻嘗試時,結果有點奇怪。

Var& nr = *(new IntVar(1)); 
nr.printType(); 
nr.printValue(); 
nr = *(new CharVar('a')); 
nr.printType(); 
nr.printValue(); 

在這裏,產量

0(類型:: INT),1,1(類型:: CHAR)和

爲什麼代碼工作,何時使用指針並且不能與引用一起工作?或者我忽略了一些明顯的錯誤?

+0

您正在使用'new'錯誤。你的程序有內存泄漏。 – celticminstrel

回答

4

使用指針的解決方案使nr首先指向IntVar,然後指向CharVar

使用引用的解決方案創建一個IntVar對象,然後爲該對象創建一個新名稱(nr),然後基於CharVar的值更改此對象的值。

引用不能像指針那樣重新設置。引用在整個生命週期中引用同一個對象。

+0

謝謝,很好的解釋:) – churill

1

聲明

nr = *(new CharVar('a')); 

是一個非常不同的含義的分配比

np = new CharVar('a'); 

12.8節:

的非隱式定義的複製/移動賦值運算符-union 類X執行其子對象的成員複製/移動分配。 首先指定X的直接基類,按其在基指定符列表中的 聲明的順序,然後按照它們的 聲明的順序分配X的非靜態數據成員的即時 在類定義....

NR使用隱式賦值運算符Var::operator=()從瓦爾那份領域。您沒有更改引用類型,它仍然是對IntVar對象的引用。

1
Var& nr = *(new IntVar(1)); //nr are Bound to IntVar object 
nr=*(new CharVar('a')); //replace the base part of IntVar object 
          // by the base part of CharVar object