【问题标题】:Overloading assignment operator for Stack in C++C++中堆栈的重载赋值运算符
【发布时间】:2016-04-14 14:43:41
【问题描述】:

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

0 1 2 3 4 5 6 7 (空的) 释放内存! 释放内存!

第一行代表堆栈a,第二行代表堆栈b(见main())和“释放内存!”是析构函数。无论出于何种原因,堆栈 a 的内容都没有复制到堆栈 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();

【问题讨论】:

  • 你是否重载了赋值运算符?如果可以,你能展示那部分吗?

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


【解决方案1】:

你有两个错误:

  1. 如果你想陷入复制构造函数,你需要使用你的注释代码而不是赋值 (Stack b(a)),因为如果你使用b = a,编译器会调用 operator=,你会得到内存泄漏错误不对指针stk 应用深拷贝,但它想删除指针并在析构函数中释放内存,即它不为指针分配内存。如果你想使用=,你必须在创建对象的同一行中指定它:Stack b = a。这相当于Stack b(a)。
  2. 另外,您需要在循环中使用您的source.top。您可能希望在循环之前离开 top = source.top;。

此外,请确保您的堆栈的 top 索引上有任何值,或者它是否指向堆栈中的一个空点。基于此,您需要决定是否需要在复制构造函数中的 for 循环中保留 = 登录。

希望对你有帮助。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-03-30
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 2015-06-01
      • 2011-01-27
      • 2011-05-31
      • 2012-08-17
      相关资源
      最近更新 更多