2013-07-18 98 views
0

我正在爲我的項目重構一個類以適應int數據。該代碼是相當複雜的,儘量給下面一個簡單的例子:我可以將指針轉換爲我的班級嗎?

struct A { 
    A(int a):a_(a) {} // Supports implicit conversion from int 
    int a_; 
}; 

void print(A a) { cout<<a.a_<<endl; } 

void x2(A *a) { // change a's value 
    a->a_ *= 2; 
} 

int main() { 
    int b = 2; 
    print(b);  // pass int as A without any problem 
    x2(&b);  // pass int* as A* - failed 
    cout<<b<<endl; // b is supposed to changed by x2() 
} 

在這種情況下,也許模板是一個不錯的選擇,但我怕rewritting與模板全班將是一個巨大的努力,並會盡特別是對我的同事來說,可讀性有一點傷害。

是否有任何其他方式使用「int *」作爲「A *」?

+1

我覺得治療'INT *'提供operator<<作爲一個''*將d對代碼的可讀性和正確性的危害要比模板更大。如果你真的想要你可以做'A a(42); x2(&a);'。 – jrok

回答

2

不,沒有「方法」。你在這裏試圖做的是違反合同x2,這就是a將是一個有效的指針A

它最簡單的變化是改變x2到: (真的沒有必要在這裏使用一個指針)

void x2 (A& a) { 
    a.a_ *= 2; 
} 

,然後與是圍繞整型包裹值調用它(如@羅建議):

A a(2); 
x2(a); 

如果您正在使用的打印conderned,爲A.

+0

將x2更改爲void x2(A&a)後,您還可以添加對struct ctor和member的引用。這樣,可以調用x2爲: {int b = 12; x2 b));}只需在需要時創建對象 – jujujuijk

+0

@jujujuijk上次我檢查了右值將無法取代非常量左值。 –

相關問題