到目前为止我的经验主要是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;
}
};
答案 0 :(得分:0)
指针需要指向有效的内存地址才能对其执行任何操作。如果没有,则会导致未定义的行为,例如,可能以应用程序崩溃结束。
但你什么时候需要这样做? 当然不在运营商超载。创建对象时,必须确保它处于有效状态。这意味着要么将其设置为nullptr
,那么它是一个空指针,或者为它分配内存。
如果在操作员过载时执行此操作,您如何确保将使用操作员重载?也许用户只想做[]
。所以你必须让一个构造函数为你的指针分配内存。或者,更好的是,使用smart pointers来挽救你的生命并避免头疼,特别是如果你来自一种没有像Java这样的显式指针的语言。
最后,有一些很好的书可以比你使用的课程更好地学习C ++。