我只是希望得到一些关于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);
};
答案 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都是在头文件中定义和实现的。
因此,您应该稍微纠正您的传统编程原理,将模板的声明和实现合并到一个头文件中。