2017-02-02 44 views
0

我目前的經驗主要是使用Java,但我試圖學習C++,而且我仍然在努力理解指針,重載等。原諒我關於標題,但我不知道如何呈現我的問題。無論如何,我在學習期間遇到了這個練習,我想要一些幫助。練習提供了一個類Container和一個main(),我應該擴展該類並使main()工作提供正確的結果。練習中的Nullpointer錯誤

template <typename T> 
class Container 
{ 
protected: 
    T * storage; 
    size_t num_items; 
    size_t storage_size; 

public: 
    virtual void operator += (const T item) { } 
    virtual ~Container() { } 
    Container() : storage(nullptr), num_items(0), storage_size(0) { } 
    T operator [] (size_t index) 
    { 
     if (num_items==0) 
     return T(0); 
     return storage[index<num_items?index:num_items]; 
    } 
    inline size_t size() { return num_items; } 
    }; 



void main(int argc, char* argv[]) 
{ 
    Container<long> * store = new Container_ex(); // I'm suppose to fill this gap 
           --------------- 
    size_t num_data; 
    cin >> num_data; 
    for (size_t i=0; i<num_data; i++) 
    { 
     long item; 
     cin >> item; 
     *store+=item; 
    } 
    for (size_t i=0; i<store->size(); i++) 
     std::cout << (*store)[i] << " "; 
    std::cout << std::endl; 
    delete store; 
} 

到目前爲止,我已經完成了這項工作。問題出在當我嘗試重載+ =因爲我得到一個異常錯誤(this->storage was nullptr)但無論如何我不明白在這個練習中完全使用存儲,所以我將不勝感激任何幫助。

class Container_ex : public Container<long> { 
public: 
    Container_ex() : Container() {} 
    ~Container_ex() { delete[] storage; } 
    void operator += (const long item) 
    { 
     *storage = const_cast<long&>(item); 
     *storage = *storage + item; 
     num_items = num_items + 1; 
     storage_size = storage_size + 1; 
    } 

}; 
+0

你從哪裏爲「存儲」分配內存? –

+0

我應該在運營商超負荷運行嗎?因爲Container中給定的構造函數初始化爲null –

+0

'storage'是一個指針,但它實際上並不*指向任何地方。您需要先將它指向某個地方,然後才能對其進行解引用。 –

回答

0

您的指針需要指向一個有效的內存地址,然後才能對其執行任何操作。例如,如果不這樣做,就會導致未定義的行爲,例如可能導致應用程序崩潰。

但是你什麼時候需要這樣做呢? 當然不在運營商超載。在創建對象時,必須確保它處於有效狀態。這意味着要麼將其設置爲nullptr,以便它是空指針或爲其分配內存。

如果你在運算符重載中做了它,你怎麼能確定運算符重載會被使用?也許用戶只想做[]。所以你必須爲你的指針創建一個構造函數來分配內存。或者,更好的辦法是使用smart pointers,這樣可以挽救你的生命並防止頭痛,尤其是當你來自沒有像Java這樣的明確指針的語言時。

最後,還有一些很棒的書比你使用的課程更好地學習C++。

  • Programming: Principles and Practice Using C++通過Bjarne的Stroustrup的,C的創建者++。假設沒有編程經驗。檢查以獲取C++ 11 |的更新版本C++ 14。
  • C++ Primer通過斯坦利李普曼喬西·拉喬巴巴拉E.武。 ~1k頁面,充滿C++ 11的細節和解釋。適用於有編程經驗的初學者。