2013-03-16 142 views
1

我有一个基类(VectorRaw)和派生类(Vector)。为什么派生类不能访问受保护的基类成员?

我在基类的构造函数中使用operator new来创建一个内存缓冲区,然后在派生类的构造函数中放置new以将元素放置在其中。

基类有它的虚拟析构函数,如果派生类的构造函数中的某些内容出错,它将清除它。

当我尝试编译它时,出现一个错误:所有基类成员(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); 
    } 
}; 
+0

哎呀,编辑:) – FrauHahnhen 2013-03-16 18:27:06

回答

5

因为你的基类是模板类,您需要通过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); 
    } 

}; 

这是必要推迟的查找这些名称直到模板参数已知。它使他们相关名称。有关更多详情,请参阅this answer

+0

有趣!我实际上已经尝试过,但是然后我的编译器抱怨操作符new(size_t),并建议使用不分配任何存储空间的operator new(size_t,void *) – FrauHahnhen 2013-03-16 18:30:32

+1

您正在使用非放置操作符错误。将'begin =(T *)运算符new(2 * size * sizeof(T));'更改为'begin = new T [2 * size];'和'operator delete(begin);'delete' ;' – 2013-03-16 18:35:04

+0

@RemyLebeau,你能解释一下这个区别吗?在文档中我看到operator new []:“缺省定义通过调用operator new分配内存::: operator new(size)” – FrauHahnhen 2013-03-16 18:51:53

相关问题