2014-02-27 54 views
1

我有這個類:推斷如果傳遞給一個funcion參數在操作等於參數

A a; 
A b; 
A c=func(a,b); 

但問題:

class A 
{ 
public: 
    //copy and move constructor,operator= 

    A func(const A& a,const A& b) 
    { 
     A c; 
     //do some stuff...   
     return c; 
    } 

}; 

它,當我以這種方式使用它工作正常是當我這樣使用它:

A a; 
A b; 
a=func(a,b); 

它做一些不必要的東西(使c和在我的課調用construc Tor是費時!)

我想知道,如果是等於把它傳遞給函數,那麼我不作c和就地

做的東西想。我來了一會兒後一個變量了此解決方案:

class A 
{ 
public: 
    //copy and move constructor and operator= 

    A func(const A& a,const A& b) 
    { 
     A c; 
     //do some stuff...   
     return c; 
    } 
    A func(const A& a,const A& b,bool inPlace) 
    { 
     if(!inPlace) 
      return func(a,b); 
     else 
     { 
      //const-cast a then do stuff on a 
      return a; 
     } 
    } 

}; 

現在它工作正常:

A a; 
A b; 
A c=func(a,b); 
a=func(a,b,true); 

但它仍然不工作:

A a; 
A b; 
b=func(a,b,true); 

因此需要func的另一個重載。

但它似乎是一個糟糕的設計。任何更好的想法,使這個類?

注意,我不想做FUNC這樣的:

void func(const A& a,const A& b,A& result) 

(很遺憾有關問題的標題我不能找到一個更好的:))

編輯

我的構造函數看起來像這樣:

A(unsigned int SIZE) 
{ 
    // all of these are vectors and SIZE is about 1k 
    realData_.reserve(SIZE); 
    timePerUnit_.reserve(SIZE); 
    prob_.reserve(SIZE); 
    //.... 

    // some math stuff for filling them 

} 
+0

請問您可以添加'class A'的構造函數嗎? – HadeS

+0

在類A中使用運算符重載=運算符。這使您可以正確分配返回的對象。 – vathsa

+1

您是否定義了移動賦值運算符? –

回答

1

從我如何理解你的問題,你想寫一個A &func(const A& a,const A& b)返回一個新構造的答:但作爲一個優化,你想修改a或b,而不是構造一個新的A如果func的結果分配給a或灣

當你寫a = func(a, b)這就像a.operator=(func(a, b))。 func不知道如何使用它的返回值,operator =不知道它的參數來自func。如果你想爲這種特殊情況進行優化,你需要爲它編寫額外的功能。

你可以寫一個未優化和優化的版本:

A &func(const A& a, const A& b) { A c; ...; return c; } 
void func(A& a, const A& b) { modify a; } 
void func(const A& a, A& b) { modify b;} 
// In case func(a,b)==func(b,a) for const a and const b you can write: 
void func(const A& a, A& b) { func(b, a); } 

或者你可以寫一個通用版本:

void func(const A& a, const A& b, A& result) 
{ 
    if(&result == &a) 
     optimized modify result; 
    else if(&result == &b) 
     optimized modify result; 
    else 
     unoptimized modify result; 
} 

如果你是幸運的,你甚至都不需要區分通用版本中的不同情況。但這取決於你正在做的計算。

順便說一句,如果你正在看STL,你會看到他們正在做類似的事情。用operator+替換字符串和func的A,最後用string operator+ (const string& lhs, const string& rhs);。該運算符將始終創建一個返回的新對象。爲了優化案例str1 = str1 + str2;,STL聲明瞭一個額外功能operator+=。這是你需要做的同樣的事情 - 只有你的函數的名字是func而不是操作符...。

1

如果你絕對不希望使用:

A func(const A& a, const A& b, const A* resultPlace = NULL) 
{ 
    if (resultPlace == &a) { 
     // Do in place stuff with a 
     return a; 
    } 
    else if (resultPlace == &b) { 
     // Do in place stuff with b 
     return b; 
    } 
    else { 
     A c; 
     // whatever 
     return c; 
    } 
} 

作者:

void func(const A& a, const A& b, A& result) 

然後,你可以通過使用指針爲你的第三個參數,而不是一個布爾值,像一個超載脫身當然,你會這樣稱呼它:b = func(a, b, &b);

不知道你是否可以做得比這更好,但我懷疑你可以做你的問題標題特別要求。

相關問題