【问题标题】:Template Stack not pushing?模板堆栈不推送?
【发布时间】:2017-10-15 20:56:00
【问题描述】:

我不断收到分段错误,不知道为什么。模板很新,我只是在试图弄清楚事情。我使用模板构建了一个堆栈,到目前为止只合并了成员函数 push 和 top/peek。正在尝试创建一个字符串堆栈。

#include <iostream>
#include <string>

template <class T>
class TemplateStack {
public:
    typedef T type;

    TemplateStack()//Default Constructor taking no parameters
    {
        max_size_ = 50;
        TopOfStack = 0;
    } 

    void push(T element)
    {
        if (TopOfStack == max_size_)
            throw string("Stack's underlying storage is overflow");
        TopOfStack++;
        data_[TopOfStack] = element;
    }

      T top() {
            if (TopOfStack == -1)
                  throw string("Stack is empty");
            return data_[TopOfStack];
      } 

private:
    size_t TopOfStack; //Generic data type for the top element of stack
    size_t max_size_;
    T* data_;
};



int Main (){
    TemplateStack <string> T;   
    T.push("Hello");
    T.push("World!");
    std::cout<<T.top()<<std::endl;
    return 0;
};

【问题讨论】:

  • 请编辑您的帖子,指出导致分段错误的语句。调试器将有助于这次十字军东征。
  • 您应该在插入元素之后增加TopOfStack 。索引值为 0 是有效索引(作为第一个元素)。

标签: c++ templates stack push


【解决方案1】:

您没有为数据成员分配内存

T* data_;

在构造函数中

TemplateStack()//Default Constructor taking no parameters
{
    max_size_ = 50;
    TopOfStack = 0;
} 

因此,任何使用指针的堆栈操作都会导致未定义的行为。

而数据成员TopOfStack根据其他方法的实现初始值为-1

我认为你的意思是至少

TemplateStack()//Default Constructor taking no parameters
{
    max_size_ = 50;
    TopOfStack = -1;
    data_ = new T[max_size];
} 

如果是这样,您还需要编写析构函数来释放分配的内存。

并且方法push应该检查另一个条件

void push(T element)
{
    if (TopOfStack + 1 == max_size_)
        throw string("Stack's underlying storage is overflow");
    TopOfStack++;
    data_[TopOfStack] = element;
}

或者由于数据成员 TopOfStack 的类型为 size_t,那么您可以编写

TemplateStack()//Default Constructor taking no parameters
{
    max_size_ = 50;
    TopOfStack = 0;
    data_ = new T[max_size];
} 

void push(T element)
{
    if (TopOfStack == max_size_)
        throw string("Stack's underlying storage is overflow");
    data_[TopOfStack++] = element;
}

  T top() {
        if (TopOfStack == 0)
              throw string("Stack is empty");
        return data_[TopOfStack -1];
  } 

【讨论】:

  • 做到了!谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-04-26
  • 2014-10-02
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 2012-04-23
  • 2014-08-04
  • 1970-01-01
相关资源
最近更新 更多