2017-08-09 59 views
1

我創建了一個Container類,並將new關鍵字與指針結合使用,以瞭解它如何工作以及如何使用它。運算符重載和設置值

template<typename T> 
class Container { 
private: 
    T value; 
public: 
    Container(T value) { 
     this->value = value; 
    } 
    Container() { 

    } 
    virtual ~Container() { 

    } 
    T getValue() { 
     return value; 
    } 
    void setValue(T value) { 
     this->value = value; 
    } 
    void operator[](T value) { 
     this->value = value; 
    } 
}; 

int main() { 

    std::vector<Container<int>*> arr(10); 
    for (int i = 0; i < 10; i++) { 
     Container<int> *a = new Container<int>; 
     a->setValue(i); 
//  a[i]; 
     arr[i] = a; 
     std::cout << arr[i]->getValue() << std::endl; 
     delete a; 
    } 

    return 0; 
} 

[]經營者有相同的代碼setValue(),但如果我用a->setValue(i)並使用a[i]它打印只是一個隨機數只打印從0至9的數字。爲什麼?

+1

我建議你閱讀[本規範的實施參考(http://en.cppreference.com/ w/cpp/language/operators#Canonical_implementations)來重載操作符。你的[數組下標運算符重載](http://en.cppreference.com/w/cpp/language/operators#Array_subscript_operator)是錯誤的。 –

+1

下標運算符將索引作爲參數,並且必須返回分配將更新的引用。 – Barmar

回答

3
  1. 請參閱Sly_TheKing's answer(將索引運算符應用於指針)。
  2. 索引運算符旨在訪問特定偏移處的值以引用某個引用。它應該接受一個有符號或無符號的整數值並返回一些特定的值。因此,運營商,是有效的,應該是這樣的:
T& operator[](size_t index) 
{ 
    return value; 
} 

其實,你沒有任何東西,你可以申請一個索引來在你的情況(唯一有效的索引是0 –或從另一個角度來看,通過上面的實現,任何索引都會返回相同的值,所以& a [0] == & a [1]將適用 - 這可能在語法上是正確的,但違反索引操作符的語義。 ),提及運營商會更合適:

T& operator*() { return value; } 
T& operator->() { return value; } 

可能的話,你可以添加一個賦值運算符,太(將取代的setValue):

Container& operator=(T const& value) { this->value = value; return *this; } 
+0

我將它改爲 void operator =(T const&value){this-> value = value; }它比Container更好,作爲返回值,仍然正確嗎? – Phil

+0

他沒有從'container'類訪問'operator []',問題不存在 –

+0

@Sly_TheKing他在這個問題中評論了它 - 然後詢問爲什麼垃圾,如果使用它...... – Aconcagua

1

在行

Container<int> *a = new Container<int>; 

您此行初始化a爲指針,所以

a[i]; 

您只需訪問一些存儲在地址a中的地址和偏移地址i * sizeof(container<int>)

所以,正確的用法是

std::vector<Container<int>*> arr(10); 
for (int i = 0; i < 10; i++) { 
    Container<int> *a = new Container<int>; 

    (*a)[i]; 
    arr[i] = a; 
    std::cout << arr[i]->getValue() << std::endl; 
    delete a; 
} 

隨着(*a)[i];訪問operator[]你在你的類中寫道