2013-07-23 38 views
1

我有一個類,它本質上是一個帶有標籤內容的數組,我想爲它定義一些運算符。我希望這樣做,以便更改類中元素的數量非常簡單,因爲我期望未來的用戶可以更改跟蹤的變量,但我也希望確保該類的基本算術運算是儘可能高效。構造運算符的結果與對默認構造對象的運算

我可以看到實施運營商的兩種方式。以某Vector2D類的例子:

struct Vector2D { 

    //members 
     const static int nElem = 2; 
     double x; 
     double y; 

    //Constructors 
     Vector2D() {}   
     Vector2D(double X, double Y) : x(X), y(Y) {} 

    //Operators 
     double& operator[] (int index) { 
     switch(index) { 
      case 0: 
      return x; 
      case 1: 
      return y; 
      default: 
      return std::out_of_range ("Oops"); 
     } 
     } 

    // Option 1: operator+ by constructing result 
    Vector2D operator+ (const Vector2D & rhs) const { 
     return Vector2D(x + rhs.x, y+rhs.y); 
    } 

    // Option 2: operator+ using loop and [] operator 
    Vector2D operator+ (const Vector2D & rhs) const { 
     Vector2D result; 
     for(int i = 0; i < nElem; i++) 
     result[i] = (*this)[i] + rhs[i]; 
     return result; 
    } 
}; 

假設我使用-03優化,會不會有中operator+兩種實現之間有什麼區別?我的理解是,因爲構造函數的默認構造函數沒有代碼體,並且類內容是默認數據類型,所以在設置其成員之前,在選項2中沒有額外的開銷來調用result上的默認構造函數。我期望這兩者是相同的,但我的知識還不夠確定。

+0

你的兩個實現不這樣做同樣的事情...第二個只是增加了'X '兩次,呃,我不確定你想怎麼做 – rabensky

+0

我的錯誤。修正了選項2. – user1476176

回答

2

你的方法根本不起作用。如果您希望某人能夠更改nElem,則不能使用xy作爲您的姓名。爲什麼?因爲將nElem更改爲3不會奇蹟般地添加z。而且由於您無法通過xy執行for循環,因此您對nElem的定義是沒有意義的。

最後,這是使用數字模板的教材。創建一個模板化了它有多少元素的矢量。

做這樣的事情:

template<unsigned int LEN> 
class Vector{ 
    double v[LEN]; 
public: 
    Vector operator+(const Vector &o){ 
    Vector res; 
    for (unsigned int i=0;i<LEN;++i) // with -O3 and small LEN this will be unrolled 
     res.v[i]=v[i]+o.v[i]; 
    } 
    // ... etc. 
}; 

然後你使用這樣的:

Vector<2> my_2d_vec; 
Vector<3> my_3d_vec; 
+0

+1,對於可擴展性問題提出了很好的建議。 – jxh

+0

我同意這是矢量示例的最佳解決方案,但我認爲這不適合我的情況。我的代碼處理一組變量,這些變量經常作爲一個組來操作,但也偶爾會單獨處理。能夠將它們全部修改爲一個組是很方便的,但也可以通過一個有意義的名稱(而不是索引)來引用它們。 – user1476176