练习中出现Nullpointer错误

时间:2017-02-02 13:35:53

标签: c++ nullpointerexception operator-overloading

到目前为止我的经验主要是Java,但我正在努力学习C ++,我仍然在努力理解指针,重载等等。请原谅我的标题,但我不知道如何提出我的问题。无论如何,我在学习期间遇到了这个练习,我想要一些帮助。练习提供了一个类Container和一个main(),我应该扩展Class并使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; 
    }

};

1 个答案:

答案 0 :(得分:0)

指针需要指向有效的内存地址才能对其执行任何操作。如果没有,则会导致未定义的行为,例如,可能以应用程序崩溃结束。

但你什么时候需要这样做? 当然不在运营商超载。创建对象时,必须确保它处于有效状态。这意味着要么将其设置为nullptr,那么它是一个空指针,或者为它分配内存。

如果在操作员过载时执行此操作,您如何确保将使用操作员重载?也许用户只想做[]。所以你必须让一个构造函数为你的指针分配内存。或者,更好的是,使用smart pointers来挽救你的生命并避免头疼,特别是如果你来自一种没有像Java这样的显式指针的语言。

最后,有一些很好的书可以比你使用的课程更好地学习C ++。

    Programming: Principles and Practice Using C++ Bjarne Stroustrup ,C ++的创建者。假设没有以前的编程经验。检查以获取C ++ 11的更新版本C ++ 14。 C++ Primer Stanley Lippman JoséeLajoie Barbara E. Moo 。 ~1k页,充满了关于C ++ 11的细节和解释。适合具有以前编程经验的初学者。