在C ++中重载Stack的赋值运算符

时间:2016-01-10 04:31:40

标签: c++ stack overloading variable-assignment operator-keyword

我正在尝试为我的Stack类重载赋值运算符(在C ++中)。当我运行输出时,我得到以下内容:

0 1 2 3 4 5 6 7 (空) 释放记忆! 释放记忆!

第一行代表堆栈a,第二行代表堆栈b(参见main())和"释放内存!"是析构函数。无论出于何种原因,Stack a的内容都没有复制到Stack b的内容中。我已经验证了容量空间是存在的(做了一堆打印语句)但复制没有发生。有人可以帮忙吗?

这是我的Stack构造函数,复制构造函数和析构函数:

/********************************/
Stack::Stack()
{
    top = -1; // array counter starts at 0
    stk = new int[MAXSIZE];
    capacity = MAXSIZE;
}
/********************************/

/********copy constructor ***********/
Stack::Stack(const Stack& source) {
  stk = new int[source.capacity]; // allocates new array space for the copy constructor
   for (int i = 0; i <= top; i++) {
      stk[i] = source.stk[i];
    }
    top = source.top;
    capacity = source.capacity;
} /******* end copy constructor *******/

Stack::~Stack() {
    cout << "Freeing memory!" << endl;
    delete[] stk;
}


Here is my main:


int main() {

    Stack a;
    for (int i=0; i < 8; i++) {
        a.push(i);
    }
    //cout << "\n Using copying incorrectly...\n";
    //Stack b(a);
    Stack b;
    b = a;
    a.display();
    b.display();

2 个答案:

答案 0 :(得分:0)

b=a正在调用赋值运算符,而不是复制构造函数。您提供的代码示例不包含赋值运算符operator=()。赋值运算符应该包含与复制构造函数基本相同的逻辑,因此您最好将该逻辑移动到新函数,并让复制构造函数和赋值运算符都调用此新函数。

答案 1 :(得分:0)

你有两个错误:

  1. 如果你想要进入复制构造函数,你需要使用你的注释代码而不是赋值(Stack b(a)),因为,如果你使用b = a,编译器将调用operator =并且你将获得内存泄漏错误,因为它不会在指针stk上应用深层复制,但它想删除指针并在析构函数中释放内存,即它不为指针分配内存。如果您想使用=,则必须在创建对象的同一行中指定它:Stack b = a。这相当于Stack b(a)
  2. 此外,您需要在循环中使用source.top。您可能希望在循环前留下top = source.top;
  3. 另外,如果您的堆栈的top索引有任何值,或者它指向堆栈中的空白点,请确保。在此基础上,您需要决定是否需要在复制构造函数中的for循环中留下=符号。

    我希望它有所帮助。