Fra*_*hen 1 c++ inheritance namespaces
我有一个基类(VectorRaw)和一个派生类(Vector).
我在基类的构造函数中使用operator new来创建一个内存缓冲区,然后在派生类的构造函数中放置new以在其中放置元素.
基类具有虚拟析构函数,如果派生类的构造函数中的某些内容出错,它将进行清理.
当我尝试编译它时,会出现一个错误:所有基类的members(begin, end, end_of_reserved
)都超出了所有派生类函数的作用域.
我究竟做错了什么?
这是我的代码:
template <typename T>
class VectorRaw {
protected:
T * begin;
T * end;
T * end_of_reserved;
VectorRaw(const size_t size) {
begin = (T*) operator new (2 * size * sizeof(T));
end = begin;
end_of_reserved = begin + 2 * size;
}
virtual ~VectorRaw<T> () throw() {
for (T * iter = begin; iter != end; ++iter) {
iter->~T();
}
operator delete (begin);
end_of_reserved = end = begin;
}
};
template <typename T>
class Vector : public VectorRaw<T> {
public:
Vector(const size_t size, const T& value) : VectorRaw<T>(size) {
for (end = begin; end != begin + size; ++end)
{
new (end) T (value);
}
}
bool Empty() const throw() {
return (begin == end);
}
};
Run Code Online (Sandbox Code Playgroud)
由于您的基类是模板类,因此您需要通过this
指针访问成员:
template <typename T>
class Vector : public VectorRaw<T> {
public:
Vector(const size_t size, const T& value) : VectorRaw<T>(size) {
for (this->end = begin; this->end != this->begin + size; ++this->end)
{
new (this->end) T (value);
}
}
bool Empty() const {
return (this->begin == this->end);
}
};
Run Code Online (Sandbox Code Playgroud)
这是推迟查找这些名称直到模板参数已知的必要条件.它使它们成为依赖名称.有关详细信息,请参阅此答案.