2011-03-31 29 views
2
#include <iostream> 
using namespace std; 

typedef int num; 

int main() { 
    num a, b; 
    cin >> a >> b; 
    cout << a + b; 
    return 0; 
} 

這樣,如果我必須通過更改一行代碼將其更改爲浮點數或複數。是typedef是否有助於提高可擴展性

這是一個很好的做法嗎?

+5

這似乎是一個很危險的事情。 – asawyer 2011-03-31 15:30:39

+0

如果你的論點是你可以改變類型爲'unsigned'或'long'或另一種整數類型,那麼你可能會更安全。從整數變爲浮點是一個更大的變化,相應地不太安全。 – 2011-03-31 15:37:08

回答

3

我不會說

typedef int num; 

因爲num並不真正意味着更多,而不是傳授更多信息,這種風格是非常有用的。但是,你做什麼,看到的是分離的類型,例如像

typedef long time_t 

在這種情況下,在標準庫,而不是使用長代表秒數,您可以使用time_t。該標準允許實現者在參數(包括浮點)內爲其選擇不同的類型。

所以,我會在減少或指定類型的含義時使用typedef,並且有幾個選擇可以滿足該定義,並且您不希望任何人依賴選擇,而僅僅是規範。

3

更有趣的問題是:爲什麼你想改變變量的類型?

因爲你必須記住,甚至像int和float這樣的數值變量在某些情況下也會有不同的表現,並且無論什麼時候將它用作這種「通用」變量,都需要考慮這些情況。因此,我傾向於這樣說:不,它不是,作爲副作用(特別是一旦項目變得比僅僅是一個hello世界更大一點;))發揮太大的作用,你可以改變類型

+0

所以,如果我想擴展這個「計算器」的能力,我會更好用一個普通的抽象類的int浮動等包裝類? – Atomble 2011-03-31 15:37:24

+2

那麼既然我們在談論C++,那麼您就有了重載函數和/或使用模板的絕佳機會。我認爲這是最好的選擇。 – Chris 2011-03-31 15:39:51

2

這聽起來像是你在尋找templates

+0

正如在這個例子中,我希望「計算器」中的所有數字具有相同的類型。不會模板讓事情變得更復雜? (例如,類型轉換?) – Atomble 2011-03-31 15:42:53

+0

不,模板允許您定義一個算法,而不必提交涉及的所有類型的數據。然後,您可以用不同的方式以不同的方式實例化模板,例如,浮動,複雜等。聽起來非常適合你的計算器。我不知道你的意思是通過類型轉換。 – 2011-03-31 15:44:42

+0

所以製作一個添加數字的模板? – Atomble 2011-03-31 15:51:36

1

理論上,從學術的角度來看,答案可能是「是」。但在現實世界中,我發現答案几乎總是「不」,這就是爲什麼。

你說你的理想將能夠做一個1行代碼更改從int s切換到float s例如,並完成。這很好,但由於某種原因,這幾乎從來沒有可能實現。

考慮一下你的實際例子。如果你有這樣的代碼:

typedef int num; 
... 
num = 42; 
... 
if(42 == num) 
    // MAGIC HAPPENS 

...然後將其更改爲:

typedef float num; 

...代碼很可能會編譯,但它無法正常工作。那是因爲你不能將浮點數與一個常量變量相比較。花車是不精確的,42f的實際表示可能類似41.99999999999999,然後if(42f == num)將返回false。

其他例子無處不在。例如,在STL集合類中使用typedef是最好的例子。如果你有這樣的:

typedef vector<string> strings; 
strings my_strings; 
... 
my_strings.find("hello"); 

...你不能只是改變的typedef是list<string>因爲list沒有一個find成員函數。

根據我的經驗,typedef對保存輸入非常有用,從而節省了潛在的錯誤,並且使代碼更具可讀性。例如:

for(strings::iterator it = my_strings.begin(); it != my_strings.end(); ++it) 

...可以說是比更易讀:

for(vector<string>::iterator it = my_strings.begin(); it != my_strings.end(); ++it) 

...特別是當容器的類型變得越來越複雜。

+0

對於不斷變化的實現和寬鬆的規範,*總是* true。接口原則上遭受同樣的問題,但他們被稱爲主的新來臨。我*仍*本能地同意你的評估,但我認爲這不完全準確。 – 2011-03-31 17:58:39

1

在某些情況下,typedef很重要。有一些技術,如Policy Clone。另外看看在GotW #46由Herb薩特給出的理由:

Typeability
短的名字

可讀性

typedef int (*Func)(int*); 
Func t(int); 

而不是

int (*t(int))(int*); 

便攜

#if defined USING_COMPILER_A 
    typedef __int32 Int32; 
    typedef __int64 Int64; 
#elif defined USING_COMPILER_B 
    typedef int  Int32; 
    typedef long long Int64; 
#endif 
相關問題