2013-06-19 50 views
0

我有一個類FooFoo有幾個非const方法。我可以在一個臨時的Foo對象上調用非const方法。我只對這些方法實際返回的內容感興趣,而不是他們對對象本身的做法。如何正確覆蓋「no non-const reference to temporary object」

第一個問題:這是否必須表明階段Foo的設計不合適?

第二個問題:如果我想按原樣繼續使用Foo,但我仍然希望能夠通過引用將調用非const方法的函數來傳遞Foo對象,那麼最佳方法是什麼做它?

這是我來到位於:

// The function that performs work on a Foo object. 
int TakeFoo (Foo& FooBar) { ... } 

// An overload just to accept temporary Foo objects. 
int TakeFoo (Foo&& FooBar) 
{ 
    // Delegate 
    return TakeFoo(FooBar); 
} 

解決的辦法是剛剛做這個:

int TakeFoo (const Foo& FooBar) 
{ 
    Foo& MyFooBar = const_cast<Foo&>(FooBar); 
    // Do work on MyFooBar 
} 

但這種方法有一個可能是const-cast'ing遠的問題const實際上聲明爲const的對象,這會將我置於undefined-behavior-land。

編輯:使用TakeFoo

代碼示例:

Foo GimmeFoo() { ... } 

cout << TakeFoo(GimmeFoo()) << endl; 

Foo ConstructedFoo(...); 

cout << TakeFoo(ConstructedFoo) << endl; 

// Continue to use ConstructedFoo 
+0

你還可以添加一些代碼來顯示客戶端代碼將如何調用和使用'TakeFoo'? – greatwolf

回答

0

回答你的第二個問題:

如果你的函數TakeFoo意味着調用foo的非const的成員,然後使用

int TakeFoo (Foo& FooBar); 

如果您確定TakeFoo只將右值作爲參數t母雞使用

int TakeFoo (Foo&& FooBar); 

如果你想要做一些改變美孚以計算int返回值,然後使用

int TakeFoo (const Foo& FooBar) 
{ 
    Foo FooBar MyFooBar = FooBar; 
    // do something with MyFooBar and return int 
} 

或者

int TakeFoo (Foo FooBar); 

回答你的第一個問題:

int TakeFoo (FooBar)不應該爲了計算而改變FooBar e結果爲int。 更好的設計將是

Foo transform_foo(Foo const& foo); 
int compute_result(Foo const& foo); 
int TakeFoo(Foo const& FooBar) 
{ 
    return compute_result(transform_foo(FooBar)); 
} 
相關問題