我想創建一個template <typename T> class InitConst
,其中的一些成員是T
的數組。我想在類的對象初始化期間填充這些數組,然後確保這些數組不會再發生變化,所以我爲每個這樣的數組定義了一個成員const T* const v
(我知道第一個const指向元素,第二個指向元素指針)。在模板中初始化const常量數組C++類
對此做了實驗使我得出結論,定義「v」爲「const指向常量」,迫使我分配和填充相應的數組,然後最終用此數組的地址初始化「v」。而且,由於我不能在類「InitConst」的構造函數體內初始化「v」,所以我得出結論:我需要一個輔助函數,它的作用是(a)獲取構造函數參數,(b)分配和填充數組,(c)使用一些靜態指針來保存這些數組的地址。這些靜態指針將最終由構造用來初始化const的指針,所以我有這樣的代碼:
template <typename T>
class InitConst
{
public:
const T* const v1;
const T* const v2;
const T* const v3;
InitConst(T a1, T a2, T a3, int n)
: v1(init(a1,a2,a3,n)), v2(init_p.temp_v2), v3(init_p.temp_v3)
{ }
private:
struct Tinit {
T* temp_v1;
T* temp_v2;
T* temp_v3;
};
static Tinit init_p;
T* init (T a1, T a2, T a3, int n)
{
init_p.temp_v1 = new T[n];
init_p.temp_v2 = new T[n];
init_p.temp_v3 = new T[n];
// populate "temp_v1", "temp_v2" and "temp_v3" using the method's arguments.
return init_p.temp_v1;
} // End method init.
}; // End class InitConst.
template <typename T>
typename InitConst<T>::Tinit InitConst<T>::init_p;
此代碼編譯和按預期工作,但我認爲這樣的設計扭曲:我習慣簡單的代碼,我首先分配一個數組,然後計算它的元素(這兩個東西通常發生在構造函數的主體中),然後使用該數組。與此相反,構造函數本身幾乎不做任何事情:它的角色轉移到方法「init」,它實際上創建了數組並使用一些輔助指針將它們傳回給構造函數。
然後我想:
一)這是設計(或類似的東西需要的),如果我決定做申報每個指針爲「常量指針爲const」,或者有一個更清潔的方式做到這一點? b)將每個指針聲明爲「const指向const」是一種防止濫用類的方法,但也許我不需要那麼多。一個稍微不嚴格的方法是將「v1」及其兄弟姐妹聲明爲私人成員,這樣他們就不能從班級之外改變。但是,這樣做也會阻止它們從課堂外讀取,並且我不希望每個「vx」陣列都有一個「read_vx」方法。那麼我能做些什麼呢,也就是說,什麼方法會導致更易讀的代碼,並且仍然保證至少數組不能從課外改變?
在此先感謝,並對長篇散文感到遺憾。
編輯:正如我在下面評論的那樣,在我的真實代碼中,我想要計算的各種數組更有效地計算在一起,這就是爲什麼我使用單個「init」函數的原因。我在示例中提供的「init」(「a1」,「a2」,「a3」)參數實際上是誤導人的。
這可能是對代碼審查 –
更好的設計更適合我的是避免裸指針和使用類型STL的。 – deepmax
噢,謝謝:我不知道CodeReview,但我將來會用它來解決類似的問題。 –