2017-02-02 5 views
0

これまでのところ私の経験はほとんどがJavaですが、私はC++を学ぼうとしていますが、ポインタやオーバーロードなどを理解するためにまだ苦労しています。タイトルについては私を許してください。私の問題。とにかく私はこの練習を勉強している間に来て、私はいくつかの助けをしたいと思います。このエクササイズでは、クラスContainerとmain()が提供されています。クラスを拡張して、main()を適切な結果を提供するようにします。エクササイズでヌルポインタエラーが発生しました

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

オペレータの過負荷の中でそれを行うべきですか?コンテナ内の指定されたコンストラクタがnullで初期化される –

+0

'storage'はポインタですが、実際には*どこでも*ポイントしません。逆参照できるようにするには、どこかを指し示す必要があります。 –

答えて

0

あなたが何かをするには、有効なメモリアドレスを指す必要があります。そうでない場合は、アプリケーションのクラッシュで終了する可能性のある未定義の動作につながります。

しかし、いつ行う必要がありますか? 確かに、演算子オーバーロードにはありません。オブジェクトを作成するときは、オブジェクトが有効な状態であることを確認する必要があります。これは、nullptrに設定するか、それがヌルポインタであるか、またはそのためのメモリを割り当てることを意味します。

演算子のオーバーロードで実行する場合、演算子のオーバーロードが使用されることをどのように確認できますか?たぶん、ユーザーはちょうど[]をやりたいと思っています。したがって、ポインタのためにメモリを割り当てるコンストラクタを作成する必要があります。あるいは、あなたの人生を救い、特にJavaのような明示的なポインタがない言語から来た場合は、頭痛を避けるためにsmart pointersを使用してください。

最後に、使用するコースよりもC++をよく学ぶ素晴らしい本がいくつかあります。 ビャーネ・ストロヴストルップ、C++の作者によって

  • Programming: Principles and Practice Using C++。以前のプログラミング経験はないと仮定します。 C++ 11用の更新版を入手するためにチェックする| C++ 14。 スタンレーリップマンジョゼ・ラジョイーバーバラE.武によって
  • C++ Primer。 〜1kページ、C++ 11の詳細と解説が満載です。以前のプログラミング経験を持つ初心者に適しています。
関連する問題