在类中使用tostring。 C ++

时间:2019-02-03 20:24:57

标签: c++ data-structures

在类中使用tostring。

#include <iostream>
#include <iomanip>
#include <string>
#include <cassert>

using namespace std;

这是我的课程LargeInteger。我在这里肯定一切都正确。

class LargeInteger {
private:
    int id;
    int numDigits; // number of digits in LargeInt / size of alloc array
    int* digits; // the digits of the LargeInt we are representing

public:
    LargeInteger(int value);
    ~LargeInteger();
    string tostring();
};

LargeInteger类的构造函数,其参数为int值。

LargeInteger::LargeInteger(int value)
{
    // set this instance id
    id = nextLargeIntegerId++;

    numDigits = (int)log10((double)value) + 1;

    // allocate an array of the right size
    digits = new int[numDigits];

    // iterate through the digits in value, putting them into our
    // array of digits.
    int digit;
    for (int digitIndex = 0; digitIndex < numDigits; digitIndex++) {
        // least significant digit
        digit = value % 10;
        digits[digitIndex] = digit;

        // integer division to chop of least significant digit
        value = value / 10;
    }
}

析构函数

LargeInteger::~LargeInteger()
{
    cout << " destructor entered, freeing my digits" << endl
         << " id = " << id << endl
         //<< " value=" << tostring() // uncomment this after you implement tostring()
         << endl;
    delete[] this->digits;
}

这是我感到困惑的地方。我在这里放什么我尝试了此操作,但是我不知道将intValue设置为什么才能获取我想要的值。

string LargeInteger::tostring()
{
    string intValue;
    //intValue = ??
    return intValue;
}

主要功能

int main(int argc, char** argv)
{
    // test constructors, destructors and tostring()
    cout << "Testing Constructors, tostring() and destructor:" << endl;
    cout << "-------------------------------------------------------------" << endl;
    LargeInteger li1(3483);
    cout << "li1 = " << li1.tostring() << endl;

    return 0
}

2 个答案:

答案 0 :(得分:1)

看一下构造函数,似乎数据结构中的数字数组是一个十进制数字序列,以相反的顺序编码为二进制(值0..9)。

因此1992年将被编码为2,9,9,1。

为了使数字可打印,您需要在其上添加“ 0”。然后,您需要从头开始迭代并连接可打印版本。像这样:

string LargeInteger::tostring()
{
    string intValue;
    for (int i=numDigits-1; i>=0; i--) 
        intValue +=  digits[i] + '0';
    return intValue;
}

Online demo

建议1

您可以很好地使用字符串,而不是将数字存储为整数数组,因为字符串可以包含任何二进制数据,包括“ \ 0”。这样可以避免内存分配的麻烦。

如果您这样做的话,还可以使用迭代器和算法,并编写与以下相同的函数:

string LargeInteger::tostring()
{
    string intValue(digits.size(),' ');
    transform (digits.rbegin(), digits.rend(), intValue.begin(), 
                                             [](auto &x){ return x+'0'; }) ; 
    return intValue;
}

Online demo

建议2

请注意,您的构造函数不适用于负数,因为log10()的负数会引发异常。

可以用绝对数字更正:

 numDigits = (int)log10(abs((double)value)) + 1;

但是,对负数使用取模可得到负数。这意味着我们需要tostring()进行更改以使用每个数字的绝对值,并且如果任何数字为负,则在数字的开头添加一个负号(请参见online demo here)。

更方便的方法是在类级别具有符号标志(例如,数字总体上为正数还是负数),并更改构造函数,以确保数字始终为正数。

答案 1 :(得分:0)

您将数字数组存储为整数的相反顺序。现在在toString中,只需将每个数字以相反的顺序转换为字符,然后将其推入字符串结果即可。这是我的解决方法

string LargeInteger::tostring()
{
    string intValue;
    //intValue = ??

    for (int index = numDigits-1; index >= 0; index--)
    {
        intValue.push_back(digits[index]+'0');
    }
    return intValue;
}