2013-03-16 140 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

相關問題