【发布时间】:2017-03-27 13:19:15
【问题描述】:
我定义了一个堆栈类,其中包含将值推送和弹出堆栈的方法。
在测试器文件中(如下所示),运行它后,发生了一个事件并且程序崩溃了。我知道这是由于函数 f 造成的,它会在两个指针指向内存中的同一位置时产生错误。如果我在调用函数时注释掉 f(s) 行,则 pop & push 函数可以正常工作并且输出正确。
为了解决这个错误,我被要求 ;为这个类创建一个拷贝构造函数来解决上面的问题。
我对此并不十分熟悉,因此如果能提供任何帮助,我们将不胜感激。谢谢
主测试文件
#include "Stack.h"
#include <iostream>
#include <string>
using namespace std;
void f(Stack &a) {
Stack b = a;
}
int main() {
Stack s(2); //declare a stack object s which can store 2 ints
s.push(4); //add int 4 into stack s
//s = [4]
s.push(13); //add int 13 into stack s
//s = [4,13]
f(s); //calls the function f which takes in parameter Stack a , and sets Stack b = to it.
//error here - as 2 pointers point to the same location in memory !
cout << s.pop() << endl; //print out top element(most recently pushed) element.
//so should output 13
return 0;
}
头文件代码
#ifndef STACK_H
#define STACK_H
class Stack {
public:
//constructor
Stack(int size);
//destructor
~Stack();
//public members (data & functions)
void push(int i);
int pop();
private:
//private members (data & functions)
int stck_size;
int* stck;
int top;
};
#endif
Stack.cpp 代码
#include "Stack.h"
#include <iostream>
#include <string>
using namespace std;
Stack::Stack(int size){
stck_size = size;
stck = new int[stck_size];
top = 0;
}
Stack::~Stack() {
delete[] stck;
}
void Stack::push(int i) {
if (top == stck_size) {
cout << "Stack overflow." << endl;
return;
}
stck[top++] = i;
}
int Stack::pop() {
if (top == 0) {
cout << "Stack underflow." << endl;
return 0;
}
top--; //decrement top so it points to the last element istead of the empty space at the top.
return stck[top];
}
【问题讨论】:
-
错误可能在您的复制构造函数中(在 Stack.h 中)。
-
包含上面的 stack.h 代码。我实际上还没有复制构造函数吗?这就是它要求我创造的东西。
-
您需要向我们提供 Stack.h(至少)和 Stack.cpp(最好)的内容,以获得任何帮助。在不了解 Stack 实现的情况下,我们如何帮助您实现 copy ctor?
-
您违反的是三法则。 What is The Rule of Three?点击链接一探究竟。它将为您节省大量的调试工作。
-
不仅需要实现拷贝构造函数,还需要赋值运算符。
标签: c++ class stack push copy-constructor