-1

我正在尝试使用 C++ 中的模板创建一个堆栈,对于 Pop 函数来说一切正常,它返回项目的地址而不是实际值,代码如下。

 template <typename T>
 class Stack {

const int size;
T* data;
int index;

public:
    Stack(){};
    Stack (const int S);
    ~Stack(){delete [] data;};
    bool Push (const T& info);
    T Pop ();
    bool is_empty();
};

 template <typename T>
 Stack <T> ::Stack (const int S) : size(S)  // Stack CTOR
 {
  this->data = new T [this->size];
  this->index=0;
 }

 template <typename T>
 bool Stack<T> ::Push (const T& info)
 {  

  if(index==(size-1))
            return false;
   else{
      this->data[index] = info;
      index++;
      return true;}
 }


template <typename T>
T Stack <T> ::Pop ()
{       
    index--;
    return (this->data[index+1]);
} 

 template <typename T>
 bool Stack<T> ::is_empty()
 {
  if(index==0){return true;}
        else
            return false;
  }

main() 是:

Stack <int> Sint (10);
Sint.Push(6);
int X = Sint.Pop();
cout<<X;  // prints out the address and not the value

提前致谢 !

4

1 回答 1

1

这里:

 template <typename T>
 bool Stack<T> ::Push (const T& info)
 {
     if (index == (size-1))
     {
         return false;
     }
     else
     {    
         this->data[index] = info;
         index++; // index becomes 1 after the first insertion...
         return true;
     }
 }

如果堆栈为空,则将项目存储在索引 0 处并增加索引,索引变为 1。然后在这里:

template <typename T>
T Stack <T> ::Pop ()
{
    index--; // index becomes 0...
    return (this->data[index+1]); // returning the uninitialized item at
                                  // index 0 + 1 = 1...
}

您正在减少索引,该索引变为 0,然后返回索引 1 处的项目,该项目从未分配过。您看到打印的不是第一个元素的地址,而是未初始化的第二个元素的值。

你应该做的是:

template <typename T>
T Stack <T> ::Pop ()
{
    if (index == 0)
    {
        // Maybe throw an exception?
        // You should handle the error condition somehow.
        return T();
    }
    else
    {
        index--;
        return (this->data[index]);
    }
}
于 2013-03-13T00:22:53.330 回答