C++快速入门--P46类模板--课上代码
#include <iostream>#include <string>
template <class T>
class Stack
{
public:
Stack(unsigned int size = 100);
~Stack();
void push(T value);
T pop();
private:
unsigned int size;
unsigned int sp;
T *data;
};
template <class T>
Stack<T>::Stack(unsigned int size)
{
this -> size = size;
data = new T;
sp = 0;
}
template <class T>
Stack<T>::~Stack()
{
delete []data;
}
template <class T>
void Stack<T>::push(T value)
{
data = value;
}
template <class T>
T Stack<T>::pop()
{
return data[--sp];
}
int main()
{
Stack<int> intStack(10);
intStack.push(1);
intStack.push(2);
intStack.push(3);
std::cout << intStack.pop() << "\n";
std::cout << intStack.pop() << "\n";
std::cout << intStack.pop() << "\n";
return 0;
}
这段代码的功能是实现一个栈类模板(Stack),可以存储任意类型的数据。
首先,我们定义了一个类模板Stack,它有三个成员函数和三个私有成员变量。构造函数Stack(unsigned int size = 100)用于创建一个大小为size的栈对象,默认大小为100。析构函数~Stack()用于释放动态分配的内存。成员函数push(T value)用于将一个值压入栈中。成员函数pop()用于弹出栈顶的值。
然后,我们定义了构造函数、析构函数和成员函数的实现。需要注意的是,在类模板的成员函数外部实现时,需要使用template关键字告诉编译器这是一个类模板的成员函数。
接下来,在main函数中,我们创建了一个Stack对象intStack,并设置大小为10。然后,连续调用push函数将1、2和3压入栈中。
根据代码的逻辑,我们可以看出这是一个有错误的代码示例:
1. 构造函数中,应该使用数组形式的new来分配动态内存,即data = new T。而不是单个元素的new,即data = new T。
2. push函数中,我们应该将新的值存储到栈中的下一个位置上,而不是覆盖掉之前存储的值。
3. pop函数中,应该返回栈顶元素,并将栈顶指针sp减1。而不是直接返回data。
下面是修正后的代码:
#include
#include
template
class Stack
{
public:
Stack(unsigned int size = 100);
~Stack();
void push(T value);
T pop();
private:
unsigned int size;
unsigned int sp;
T *data;
};
template
Stack::Stack(unsigned int size)
{
this->size = size;
data = new T;
sp = 0;
}
template
Stack::~Stack()
{
delete[] data;
}
template
void Stack::push(T value)
{
data = value;
sp++;
}
template
T Stack::pop()
{
if (sp == 0) {
throw "Stack is empty";
}
sp--;
return data;
}
int main()
{
Stack<int> intStack(10);
intStack.push(1);
intStack.push(2);
intStack.push(3);
std::cout << intStack.pop() << std::endl; // 输出3
std::cout << intStack.pop() << std::endl; // 输出2
std::cout << intStack.pop() << std::endl; // 输出1
return 0;
}
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]