【发布时间】:2021-08-04 00:59:03
【问题描述】:
到目前为止,这是我的课程:
template <typename T>
class myClass
{
private:
size_t capacity_;
size_t size_;
T* the_array;
public:
myClass(size_t cap) {
capacity_ = cap;
size_ = 0;
the_array = new T[capacity_];
}
~myClass() { clear(); }
virtual size_t capacity() const {
return capacity_;
}
virtual size_t size() const {
return size_;
}
virtual bool clear() {
delete[] the_array;
return true;
}
};
我试图在构造函数中分配数组,但是当我创建一个 myClass 对象时,它的 the_array 不是具有我请求的容量的数组。调试时,the_array 只是一个指向 T 的指针。我不确定问题出在构造函数中还是在我为指向 the_array 的指针的私有变量的声明中。
【问题讨论】:
-
如果你想避免头痛,可以使用std::vector
-
顺便说一句,你有
virtual成员函数但没有virtual析构函数,这通常是一个不好的方法。我建议在这里删除virtual,或者如果您确实需要动态调度,请将析构函数标记为virtual。 -
Handy extra reading。 TL;DR 版本,如果你有析构函数,你可能需要一个复制构造函数和赋值运算符来配合它。
-
“the_array 只是一个指向 T 的指针”——我要告诉你一个大秘密:在 C++ 中没有数组这样的东西。这是一个海市蜃楼,一个幻觉,一个花招。数组实际上只是指向数组第一个值的指针。您的调试器只是向您展示了真实的、红色的状态。显示代码的唯一问题是
clear()应该清除已删除数组的指向nullptr的指针,并且该类需要一个复制构造函数和一个赋值运算符。 -
查找“C++ 三规则”。要点是,如果您的类直接管理需要非平凡破坏(即释放资源)的资源(在您的情况下为内存),那么您的类还需要一个复制构造函数和一个赋值运算符。在 C++11 及更高版本中,三规则(通常)变为五规则。