template<class T,int SIZE=20> class Stack { public: Stack() { this->size = SIZE; this->p = new T[SIZE]; memset(this->p, 0, sizeof(T) * SIZE); } Stack(int n) { if (n <= 0) n = SIZE; this->size = n; this->p = new T[n]; memset(this->p, 0, sizeof(T) * n); } Stack(const Stack<T>& stac) { this->size = stac.size; this->p = new T[stac.size]; for (int i = 0; i < stac.size; ++i) { this->p[i] = stac.p[i]; } }这样写的拷贝构造函数正确吗
时间: 2024-04-04 18:30:25 浏览: 115
这样写的拷贝构造函数是不正确的,因为它没有考虑到浅拷贝可能导致的问题。在进行浅拷贝时,拷贝构造函数只是复制了指针的值,而没有复制指针所指向的堆内存中的数据。这意味着,如果原对象和拷贝对象指向同一块堆内存时,当一个对象销毁时,它会释放这段内存,这将导致另一个对象指向的内存变成非法的。因此,在实现拷贝构造函数时,需要进行深拷贝,即重新分配一块内存并将原对象的数据复制到新的内存中。
相关问题
#include<iostream> using namespace std; const int Stacksize=10;//数组长度 template <class T> //顺序栈 class seqstack { public: seqstack(){top=-1;}//初始化一个空栈 ~seqstack(){}; void push(T x);//入栈 T pop();//出栈 将栈顶元素弹出 T gettop();//获取栈顶元素 int Empty(); void printstack(); private: T data[Stacksize];//存放栈元素的数组 int top;//栈顶元素在数组中的下标 //长度sta为5 top指向0-4 }; template <class T> void seqstack<T>::push(T x) { if(top==Stacksize-1) throw'上溢'; top=top++; data[top]=x; } template<class T> T seqstack<T>::pop() { //T x; if(top==-1) throw'空栈,无法取出'; // x=data[top--]; return data[top]; top--; } template<class T> T seqstack<T>::gettop() { return data[top]; } template<class T> void seqstack<T>::printstack() { while(top!=-1) { cout<<data[top]<<' '; top--; } cout<<endl; } int main() { int i; int y; seqstack<int> s; cout<<"进行入栈"<<endl; s.push(5); s.push(15); s.printstack(); s.push(90); s.push(3); cout<<"获取栈顶元素"<<endl; cout<<s.gettop()<<endl;; cout<<"执行出栈操作"<<endl; i=s.pop(); cout<<i<<endl; cout<<"获取栈顶"<<endl; y=s.gettop(); cout<<y<<endl; }
这段代码有一些错误,我帮您修改一下:
```c++
#include<iostream>
using namespace std;
const int Stacksize = 10; //数组长度
template <class T> //顺序栈
class seqstack {
public:
seqstack() { top = -1; } //初始化一个空栈
~seqstack() {};
void push(T x); //入栈
T pop(); //出栈 将栈顶元素弹出
T gettop(); //获取栈顶元素
int Empty();
void printstack();
private:
T data[Stacksize]; //存放栈元素的数组
int top; //栈顶元素在数组中的下标
//长度sta为5 top指向0-4
};
template <class T>
void seqstack<T>::push(T x) {
if (top == Stacksize - 1) throw '上溢';
top++; //修正top的值
data[top] = x;
}
template<class T>
T seqstack<T>::pop() {
if (top == -1) throw '空栈,无法取出';
T x = data[top];
top--; //修正top的值
return x;
}
template<class T>
T seqstack<T>::gettop() {
return data[top];
}
template<class T>
void seqstack<T>::printstack() {
int t = top;
while (t != -1)
{
cout << data[t] << ' ';
t--;
}
cout << endl;
}
int main() {
int i;
int y;
seqstack<int> s;
cout << "进行入栈" << endl;
s.push(5);
s.push(15);
s.printstack();
s.push(90);
s.push(3);
cout << "获取栈顶元素" << endl;
cout << s.gettop() << endl;;
cout << "执行出栈操作" << endl;
i = s.pop();
cout << i << endl;
cout << "获取栈顶" << endl;
y = s.gettop();
cout << y << endl;
}
```
主要的修改如下:
1. 在 `seqstack` 类模板中,修正了 push 和 pop 函数中 top 的赋值错误,现在程序可以正常入栈和出栈了。
2. 在 `seqstack` 类模板中,修正了 pop 函数中返回值的问题,现在可以正确返回出栈的元素值。
3. 在 `seqstack` 类模板中,修正了 printstack 函数中 top 的值被修改的问题,现在可以正常输出栈中的元素了。
c++设置一个vlist线性表类,抽象函数in(),out(),表示进表和出表,由Stack类和Quene类继承vlist,实现vlist指针既能是栈也可以是队列的功能。同时还可对不同的数据类型进行进表和出表。 并补充以下代码: #include <iostream> using namespace std; #include<string> #include"math.h" template<class T> class vlist//线性表抽象类 { public: virtual void in(T &e)=0; virtual T out()=0; }; template<class T> class Element { public: T data; Element<T> *next; Element(){} }; int main() { vlist<int> *intp; vlist<string> *strp; SStack<int> ints; Quene<int> intq; SStack<string> strs; Quene<string> strq; intp=&ints; int t=2; intp->in(t); t=3; intp->in(t); t=4; intp->in(t); for(int i=0;i<3;i++) cout<<intp->out(); intp=&intq; t=2; intp->in(t); t=3; intp->in(t); t=4; intp->in(t); for(int i=0;i<3;i++) cout<<intp->out(); strp=&strs; string str; cout<<endl; for(int i=0;i<3;i++) { cin>>str; strp->in(str); } for(int i=0;i<3;i++) cout<<strp->out()<<" "; cout<<endl; strp=&strq; for(int i=0;i<3;i++) { cin>>str; strp->in(str); } for(int i=0;i<3;i++) cout<<strp->out()<<" "; }
好的,这是一个比较典型的面向对象的编程题目。我根据题目描述,补充了一下代码,希望可以帮到你:
```c++
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
template <class T>
class Element {
public:
T data;
Element<T> *next;
Element() {
next = NULL;
}
};
template <class T>
class vlist//线性表抽象类
{
public:
virtual void in(T &e) = 0;
virtual T out() = 0;
};
template <class T>
class SStack : public vlist<T> {
public:
Element<T> *top;
SStack() {
top = NULL;
}
void in(T &e) {
Element<T> *p = new Element<T>();
p->data = e;
p->next = top;
top = p;
}
T out() {
T e = top->data;
Element<T> *p = top;
top = top->next;
delete p;
return e;
}
};
template <class T>
class Quene : public vlist<T> {
public:
Element<T> *head;
Element<T> *tail;
Quene() {
head = tail = NULL;
}
void in(T &e) {
Element<T> *p = new Element<T>();
p->data = e;
if (tail == NULL) {
head = tail = p;
} else {
tail->next = p;
tail = p;
}
}
T out() {
T e = head->data;
Element<T> *p = head;
head = head->next;
delete p;
if (head == NULL) {
tail = NULL;
}
return e;
}
};
int main() {
vlist<int> *intp;
vlist<string> *strp;
SStack<int> ints;
Quene<int> intq;
SStack<string> strs;
Quene<string> strq;
intp = &ints;
int t = 2;
intp->in(t);
t = 3;
intp->in(t);
t = 4;
intp->in(t);
for (int i = 0; i < 3; i++) {
cout << intp->out() << " ";
}
intp = &intq;
t = 2;
intp->in(t);
t = 3;
intp->in(t);
t = 4;
intp->in(t);
for (int i = 0; i < 3; i++) {
cout << intp->out() << " ";
}
strp = &strs;
string str;
cout << endl;
for (int i = 0; i < 3; i++) {
cin >> str;
strp->in(str);
}
for (int i = 0; i < 3; i++) {
cout << strp->out() << " ";
}
cout << endl;
strp = &strq;
for (int i = 0; i < 3; i++) {
cin >> str;
strp->in(str);
}
for (int i = 0; i < 3; i++) {
cout << strp->out() << " ";
}
return 0;
}
```
这个程序中,我们首先定义了一个抽象类 `vlist`,它包含了两个纯虚函数 `in()` 和 `out()`,表示线性表的进表和出表操作。然后,我们定义了两个类 `SStack` 和 `Quene` 分别继承了 `vlist` 类,实现了栈和队列的功能。
在 `SStack` 类中,我们使用一个指针 `top` 来表示栈顶元素。在进表操作中,我们创建一个新的元素,并把它放到栈顶,然后更新 `top` 指针。在出表操作中,我们首先取出栈顶元素,然后删除它并更新 `top` 指针。
在 `Quene` 类中,我们使用两个指针 `head` 和 `tail` 分别表示队列头和队列尾。在进表操作中,我们创建一个新的元素,并把它放到队列尾部,然后更新 `tail` 指针。在出表操作中,我们首先取出队列头元素,然后删除它并更新 `head` 指针。如果此时队列为空,我们还需要把 `tail` 指针设置为 `NULL`。
最后,我们在 `main` 函数中创建了四个对象:`ints`、`intq`、`strs` 和 `strq`,并把它们赋值给对应的指针。然后,我们分别进行了进表和出表操作,并输出了结果。
希望这个答案能够帮到你!
阅读全文