2014-02-18 21 views
0

我正在學習一些課程,我們將介紹幾個軟件模式,其中一個是迭代器模式,我們被要求用C++實現它。我們的教授在幾周前給了我們一些示例代碼,我想比我更好地理解它。首先,我將張貼代碼:關於C++中數組模板的問題

template <class T_,std::size_t SIZE_> 
class carray { 
public: 
typedef T_    value_type; 
typedef std::size_t  size_type; 
typedef T_ &   reference; 
typedef T_ const &  const_reference; 
typedef T_ *   pointer; 
typedef T_ const *  const_pointer; 
typedef T_ *   iterator; 
typedef T_ const *  const_iterator; 
typedef std::ptrdiff_t difference_type; 

typedef std::reverse_iterator<iterator> reverse_iterator; 
typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 

// data store 
value_type data[SIZE_]; 

size_type size() const { return SIZE_; } 
reference operator [] (size_type idx) { return data[idx]; } 
const_reference operator [] (size_type idx) const { return data[idx]; } 

reverse_iterator rbegin() { return reverse_iterator(end()); } 
reverse_iterator rend() { return reverse_iterator(begin()); } 
const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } 
const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } 
const_reverse_iterator crbegin() const { return const_reverse_iterator(end()); } 
const_reverse_iterator crend() const { return const_reverse_iterator(begin()); } 

iterator begin() { return data; } 
iterator end() { return data + SIZE_; } 
const_iterator begin() const { return data; } 
const_iterator end() const { return data + SIZE_; } 
const_iterator cbegin() const { return data; } 
const_iterator cend() const { return data + SIZE_; } 

}; 

在這個模板我們的教授定義了一堆類型定義的,和他們幾個人既具有非恆定的和恆定的版本。首先,我想知道每個公共成員的目的是什麼,其次,在定義數據結構模板的上下文中,我想知道常量版本的目的是什麼。

我還注意到一些成員函數被定義爲'const',我不知道它的目的是什麼。

回答

1

我想知道每個公衆會員的目的是什麼。

類包含以下內容:

  • 類型別名:即從類公開供公衆使用的類型信息。

    • 非const typedef s爲用於非constT類型別名。
    • const typedefs是constT的類型別名。

    這些typedef s爲有用的,因爲類的用戶可能需要有關類型的詳細信息。通過使用課堂暴露的typedef,他可以獲得這個。這裏有一個很好的例子 - 考慮我們有模板類型的情況,我們需要訪問基礎迭代器類型。通過使用裸露型的別名,我們可以訪問它:

    template<class Container> 
    void example(Container& c) 
    { 
        typename Container::iterator begin = c.begin(), 
        //  ^^^^^^^^^^^^^^^^^^^ 
               end = c.end(); 
    } 
    

    我不知道恆版本的目的是。

    有時用戶需要使用const類型。因此,使用類提供的類型信息使得這很簡單。

我還注意到,一些成員函數定義爲「常量」,我不知道那的目的是什麼。

const成員函數是不修改任何類數據成員的函數。

+0

謝謝。在這個例子中,我想知道爲什麼需要一個常量迭代器?爲什麼我們有兩個開始函數返回一個const和非const迭代器? – mcraen

+0

@CanadianCoder我們永遠不知道用戶的意圖。因此我們爲他們提供兩種選擇。例如,如果用戶想要使用'const'' carray'對象,那麼他們需要'const'迭代器,如果他們想迭代它。他們不能使用非''contst'版本來做到這一點。 – 0x499602D2

1
  1. 所有類型定義的目的是方便使用這些類型的, std::size_t std::ptrdiff_t只是unsigned int類型的typedef。對於reverse_iterator的 再檢查一下here爲const版本功能,其被提供爲常量obj的返回值定義

  2. 常量varialbe,檢查定義爲const here

  3. 成員函數請確保成員變量不在函數體改變,檢查here

1
  1. 對於這一點,我想你應該嘗試使用此模板,你可能真的知道它爲什麼需要這樣的公共成員。當我們使用這個模板來操作某些數據結構時,如果我們想要修改某些數據,我們需要一個非常量版本。另一方面,如果我們想改變數據的價值,我們需要一個可以幫助我們保護數據的恆定版本。

  2. 當您試圖對某些數據進行操作並且您不想修改成員數據時,常量函數可以幫助您。