想要一些关于堆栈实现C ++的反馈

时间:2015-09-23 01:10:23

标签: c++

我只是希望得到一些关于Stack的C ++实现的反馈。我知道这有点乱,但我正在努力改进我使用类的方式。我很确定我没有正确使用模板。

欢迎任何建议!

#include <iostream>
#include </root/Dev/Stack.h>
#include<string>

using namespace std;

template<class T>
Stack<T>::Stack(T &size)
{
    capacity = size;

    if(size==0)
    {
        cout<<"Capacity can't be zero!"<<endl;
        stack = 0;
    }
    else
    {
        stack = new T[capacity];
    }

    count = -1;
}

template<class T>
void Stack<T>::Insert(T &data)
{
    if (count == (capacity-1))
    {
        cout<<"Stack is full";
        return;
    }
    else
    {
        count++;
        stack[count] = data;
    }
}

template<class T>
void Stack<T>::Display()

{
    cout << "Printing out values:" << endl;
    for (int i=0; i<count; i++)
        cout << stack[i] << endl;
}

int main()
{
    Stack<int> S1(5);

    S1.Insert(10);
    S1.Insert(22);
    S1.Insert(5522);
    S1.Display();

    Stack<string> S2(6);
    S2.Insert("hi");
    S2.Insert("Savvy");
    S2.Insert("How are you?");
    S2.Display();

    return 0;
  }

标题文件:

#include<iostream>

using namespace std;

template<class T>
class Stack {

public:
    int capacity;
    int count;
    T *stack;
    void Insert(T &num);
    void Display();

    Stack(T &value);
  };

2 个答案:

答案 0 :(得分:0)

我很确定这不应该编译。您尚未在源文件中声明模板(这是一个奇怪的要求,请参见此处:Why can templates only be implemented in the header file?)。这可以通过在template class Stack<int>;之前添加template class Stack<string>;int main来解决。

否则,如果添加析构函数(其主体基本上为delete[] stack;)并添加了从堆栈中删除的方法(通常的功能),这应该可以正常工作。

另外,请考虑将T* stack设为私有封装。

最后,在insert中,考虑抛出异常而不是在打印后返回。在大型项目中使用它会更好。

除模板声明问题外,您对模板的使用完全没问题。

答案 1 :(得分:0)

关于Stack类模板的实现将无法正常工作,它将在编译期间失败。为什么呢?

任何类模板的声明和实现都不能在.cpp和.h 2文件中分开,否则编译将失败。

因为模板类Stack {...}类T是任意的。如您所知,C ++是一种静态语言,因此编译器需要知道在编译过程中应为每个数据(或对象)类型分配的确切内存大小。

但是类模板T是任意的,你不知道它应该在调用之前分配的确切内存大小。因此编译器无法初始化类模板对象。

有一个常识,所有编译器,无论它来自哪个,Microsoft,ANSI,ISO,Google或GCC,都不支持编译分离的模板代码。必须在头文件中写入所有模板(类模板和函数模板)的声明和实现。

如果您不相信,可以去查看STL的源代码,所有STL都是在头文件中定义和实现的。

因此,您应该稍微纠正您的传统编程原理,将模板的声明和实现合并到一个头文件中。