2012-03-30 46 views
2

我想定義一個類myVector,它既支持分配operator=,也支持括號訪問,例如myclass(1) = 0.5。看到此代碼因爲()不能被編譯沒有被定義爲常數函數下面C++中的過載分配和圓括號運算符

class myVector 
{ 
public: 
    vector<double> _v; 
    myVector(unsigned int size) : _v(size, 0) { } 

    double& operator()(int i) 
    { 
     return _v[i]; 
    } 

    unsigned int size() const { return _v.size(); } 

    myVector& operator=(const myVector& v) 
    { 
     _v.resize(v.size()); 
     for(int i=0;i<v.size();i++) 
      _v[i] = v(i); 
    } 
} 

虛設例子。這是因爲我想啓用直接分配,例如myvector(1) = 2。爲了解決這個問題,我只能想到兩個解決方案。一個是定義某事物。像double getValue(int i) const,但這似乎很奇怪,因爲一些重複的代碼被添加。另一種是從()函數的簽名中刪除const,但這也是不理想的。我相信會有一個很好的工作,但我找不到它。

+1

爲什麼這麼複雜 - 你可以說'_v = v;',或'_v.swap(v);'。 – 2012-03-30 21:08:01

+5

那些圓括號被稱爲「括號」,並且操作員被稱爲「函數調用操作」 – 2012-03-30 21:09:07

+0

這是較早的問題幾乎如出一轍。 http://stackoverflow.com/questions/5762042/const-overloaded-operator-function-and-its-invocation/5762323。 [我的回答](http://stackoverflow.com/a/5762323/179910)也適用於此。 – 2012-03-30 21:17:45

回答

2

正確的解決方案是「兩者」。包括運算符在內的成員函數可以在const上重載(指針this實際上是一個參數並且參與重載解析)。

double& operator()(int i) { return _v[i]; } 
double operator()(int i) const { return _v[i]; } 

注意:對於非成員操作符,左側對象不僅僅是一個參數,它是一個參數。

+0

謝謝,這是非常有幫助的。 – 2012-03-31 00:10:45

0

對於運營商()的特定情況下,你應該只提供兩個重載:

double& operator()(int i) { return _v[i]; } 
double operator()(int i) const { return _v[i]; } // [1] 

如果這是一個模板容器,第二個重載將返回const&,但考慮到它是一個double ,返回副本是好的。

現在,作爲一個建議,您可以實現拷貝構造函數,然後實現一個簡單的swap功能:

void myVector::swap(myVector & lhs) { 
    _v.swap(lhs._v); 
} 

有了這兩個工具,那麼你可以使用慣用的實施operator=

myVector& myVector::operator=(myVector rhs) { // by value 
    swap(*this, rhs); 
    return *this; 
} 

的另一件事是,它沒有任何意義,以推出自己的循環複製的載體,他們已經知道該怎麼做自己,所以_v = v._v;與您的循環具有相同的效果。