为什么这个方法给出两个不同的结果?

Why is this method giving two different results?

本文关键字:两个 结果 方法 为什么      更新时间:2023-10-16

所以我有一个叫做HugeInt的类,它存储一个动态整数数组,每个位置对应一个小数点(arr[0] = 2^0, arr[1] = 2^1…)。我还有reverse这个方法,它把数字反过来。但主要给出了两种不同的结果,有人能帮忙吗?DynArray是我创建的动态数组类。它只包含一个int型数组,它会根据是否向数组中添加元素而调整大小。(不能使用向量)

HugeInt HugeInt::reverse(){
    HugeInt hi;
    for (int i = 0; i < this->size; i++){
        hi.dyn.add(this->dyn[this->size - 1 - i]);
    }
    return hi;
}

我的打印功能:

void HugeInt::print(){
    dyn.print();
}
void DynArray::print(){
    for (int i = 0; i < nextIndex; i++){
        std::cout << arr[i];
    }
}
我的操作符=

:

HugeInt& HugeInt::operator=(const HugeInt &b1)
{
    this->dyn = b1.dyn;
    this->size = b1.size;
    return *this;
}

当我运行这个:

int main(int argc, char *argv[])
{
    HugeInt hi4("123456");
    hi4.print();
    cout << endl;
    cout << endl;
    hi4.reverse().print();
    cout << endl;
    cout << endl;
    hugeInt = hi4.reverse();
    hugeInt.print();
}

我得到这些结果:

<>之前1234566543213854321之前

为什么最后一个结果和第二个结果不同?我不习惯用c++编程,所以我觉得我可能忽略了一些c++的东西?

更新:好吧,我现在完全迷路了。我把反向()改成:

HugeInt HugeInt::reverse()
{
    return *this;
}

和my main as:

int main(int argc, char *argv[])
{
    HugeInt hi4("123456");
    hi4.reverse().print();
    cout << endl;
    cout << endl;
    hugeInt = hi4.reverse();
    hugeInt.print();
}
并得到结果 <>之前1234563223456之前

32在ASCII表中是'Space', 38是&和之前说的一样。我迷路了!

HugeInt HugeInt::reverse()中的这一行

this->~HugeInt();

这意味着你第一次调用hi4.reverse(),你破坏了hi4

每次在后面使用它都是未定义的行为。

删除该行。我不知道你希望在那里做什么,但是"什么都不做"可能是更好的事情。

我试图实现您的问题。我不得不对这些类的内部进行一些即兴创作,但这段代码与MS VS 2010一起完美地工作。

我的程序:

//file: header.h
//author: kupto
#pragma once
#include <iostream>
#include <stdio.h>
#include <vector>
class DynArray
{
    std::vector<char> arr;
public:
    void print();
    void add(char c) {arr.push_back(c);};
    char get(int pos) {return (arr[pos]);};
    int size() {return arr.size();};
};
void DynArray::print()
{
    for (int i = 0; i < this->size(); i++)
        std::cout << arr[i];
    std::cout << std::endl;
}
class HugeInt
{
    DynArray dyn;
public:
    void print() {dyn.print();}
    int size() {return (dyn.size());}
    HugeInt HugeInt::reverse();
    HugeInt(char* str);
    HugeInt() {};
};
HugeInt::HugeInt(char* str)
{
    char c;
    int i = 0;
    c = str[i];
    while (c)
    {
        dyn.add(c);
        c = str[++i];
    }
}
HugeInt HugeInt::reverse()
{
    HugeInt hi;
    for (int i = 0; i < this->size(); i++){
        hi.dyn.add(this->dyn.get(this->size() - 1 - i));
    }
    return hi;
}

和源文件:

//file: source.cpp
//author: Kupto
#include "header.h"
using namespace std;
int main()
{
    HugeInt hi4("123456");
    hi4.print();
    hi4.reverse().print();
    HugeInt hugeInt = hi4.reverse();
    hugeInt.print();
    hi4 = hugeInt;
    hi4.print();
    hi4 = hi4.reverse();
    hi4.print();
    return 0x00;
}

输出如预期:

123456
654321
654321
654321
123456

注意,我使用DynArray::get(int)方法而不是你的operator[int]。祝你的代码顺利。