C++ C+中堆栈的重载赋值运算符+;

C++ C+中堆栈的重载赋值运算符+;,c++,stack,overloading,variable-assignment,operator-keyword,C++,Stack,Overloading,Variable Assignment,Operator Keyword,我正在尝试重载堆栈类的赋值运算符(在C++中)。当我运行输出时,我得到以下结果: 01 2 3 4 5 6 7 (空) 释放记忆! 释放记忆 第一行表示堆栈a,第二行表示堆栈b(请参见main()),而“释放内存!”是析构函数。无论出于何种原因,堆栈a的内容都不会复制到堆栈b的内容中。我已经验证了容量空间在那里(做了一堆打印语句),但是复制没有发生。有人能帮忙吗 这是我的堆栈构造函数、复制构造函数和析构函数: /********************************/ Stack::S

我正在尝试重载堆栈类的赋值运算符(在C++中)。当我运行输出时,我得到以下结果:

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

第一行表示堆栈a,第二行表示堆栈b(请参见main()),而“释放内存!”是析构函数。无论出于何种原因,堆栈a的内容都不会复制到堆栈b的内容中。我已经验证了容量空间在那里(做了一堆打印语句),但是复制没有发生。有人能帮忙吗

这是我的堆栈构造函数、复制构造函数和析构函数:

/********************************/
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();
/********************************/
Stack::Stack()
{
top=-1;//数组计数器从0开始
stk=新整数[MAXSIZE];
容量=最大尺寸;
}
/********************************/
/********复制构造函数***********/
堆栈::堆栈(常量堆栈和源){
stk=newint[source.capacity];//为复制构造函数分配新的数组空间

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

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

您有两个错误:

  • 如果你想加入复制构造函数,你需要使用你的注释代码而不是赋值(
    stackb(a)
    ),因为,如果您使用
    b=a
    ,编译器将调用运算符=,您将得到内存泄漏错误,因为它不在指针
    stk
    上应用深度复制,但它想删除指针并在析构函数中释放内存,即它不为指针分配内存。如果您想使用
    =/code>,则必须o在创建对象时将其分配到同一行:
    堆栈b=a
    。这相当于
    堆栈b(a)
  • 此外,您需要在循环中使用
    source.top
    。您可能希望在循环之前保留
    top=source.top;
  • 此外,请确保堆栈的
    top
    索引上是否有任何值,或者它是否指向堆栈中的空白点。根据这一点,您需要决定是否需要在复制构造函数中的for循环中保留
    =
    签名

    希望有帮助。

    您有两个错误:

  • 如果你想加入复制构造函数,你需要使用你的注释代码而不是赋值(
    stackb(a)
    ),因为,如果您使用
    b=a
    ,编译器将调用运算符=,您将得到内存泄漏错误,因为它不在指针
    stk
    上应用深度复制,但它想删除指针并在析构函数中释放内存,即它不为指针分配内存。如果您想使用
    =/code>,则必须o在创建对象时将其分配到同一行:
    堆栈b=a
    。这相当于
    堆栈b(a)
  • 此外,您需要在循环中使用
    source.top
    。您可能希望在循环之前保留
    top=source.top;
  • 此外,请确保堆栈的
    top
    索引上是否有任何值,或者它是否指向堆栈中的空白点。根据这一点,您需要决定是否需要在复制构造函数中的for循环中保留
    =
    签名


    我希望这会有帮助。

    您是否重载了赋值运算符?如果是,能否显示该部分?是否重载了赋值运算符?如果是,能否显示该部分?