アルゴリズムとデータ構造の勉強で、stackのデータ構造を(オブジェクト指向の考えとあっているかどうかはさておき)クラステンプレート形式でつくっているのですが、stackのサイズを2倍に拡張するresize()内でコピー用の配列、T copy[]を宣言した際に、
const unsigned int csize = m_usageTop + 1;
T copy[csize];
と書くと、ビルド時に「error : サイズが0の配列を宣言しようとしました」「error : copyのサイズが不明です」と怒られました。m_usageTopはunsigned intのメンバ変数で、コンストラクタで0になるようになっていますが、resizeが呼ばれるのはunsigned intでありstackのサイズを知るメンバ変数sizeをm_usageTopが>=したときだけで、しかもcsizeは+1しているconst変数なので、なぜ怒られるのか分かりません。また、T* copy = new T[m_usageTop]としたときはうまくいきます。newでもいいのですが、newだとheap領域を使うとか、フラグメンテーションの関係でnew, deleteの回数は減らすべきだとかあるのでどうにか改善したいです。
template<typename T>
class Stack{
private:
T* item;
const unsigned int iniSize;
unsigned int size;
unsigned int m_usageTop;
-- 略 --
template<typename T>
Stack<T>::Stack() : iniSize(5), size(5), m_usageTop(0){ // constメンバ変数は初期化リストでないと初期化できない
item = new T[iniSize];
for(unsigned int i = 0; i < this->size; i++)
item[i] = 0;
}
template<typename T>
Stack<T>::Stack(unsigned int size) :iniSize(size), size(size), m_usageTop(0){
item = new T[iniSize];
for(unsigned int i = 0; i < this->size; i++)
item[i] = 0;
}
template<typename T>
Stack<T>::~Stack() {
delete[] item;
item = nullptr;
std::cout << "stack memory is deleted" << std::endl;
}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2014/11/24 05:20