在构造函数中分配私有变量

时间:2011-02-04 04:54:44

标签: c++

我过去曾多次读过堆栈溢出线程,而且它们通常非常有用。但是,我遇到了一个对我来说根本没有意义的问题,而我正试图弄清楚我错过了什么。以下是我遇到问题的代码部分:

class BigInts
{

public:


    static const std::size_t MAXLEN = 100;


    BigInts(signed int i); //constructor
    BigInts(std::string &); //other constructor

    std::size_t size() const;

    digit_type operator[](std::size_t ) const;


private:
    digit_type _data[MAXLEN];
    bool       _negative;
    int _significant;
};

//nonmember functions

std::ostream & operator << (std::ostream &, const BigInts &);


BigInts::BigInts(signed int i)
{
    _negative = (i < 0);
    if (i < 0)
    {
        i = -1*i;
    }

    std::fill(_data, _data+MAXLEN, 0);

    if (i != 0)
    {
        int d(0);
        int c(0);
        do
        {
            _data[d++] = ( i % 10);
            i = i / 10;
            c++; //digit counter
        }while(i > 0);

        //_significant = c; //The problem line

        assert(c <= MAXLEN); //checks if int got too big
    }
}

std::size_t BigInts::size() const
{
    std::size_t pos(MAXLEN-1);
    while (pos > 0 && _data[pos] == 0)
    --pos;
    return pos+1;
}

std::ostream & operator << (std::ostream & os, const BigInts & b)
{

    for (int i = (b.size() - 1);  i >= 0; --i)
        os << b[i];
    return os;
}

int main()
{
signed int a, b;


std::cout << "enter first number" << std::endl;
std::cin >> a;

std::cout << "enter second number" << std::endl;
std::cin >> b;

BigInts d(a), e(b), f(b);

std::cout << d << " " << e << " " << f;

主要编辑,从尝试的虚拟版本代码切换到我正在使用的实际代码,完成原始变量名称。我试图删除任何与我正在使用的代码无关的内容,但如果你看到一个奇怪的名字或打电话,请告诉我,我可以发布相关部分。

在引入_significant之前,代码一直运行正常,这是我添加的一个变量,用于为整个类添加更多功能。但是,当我尝试使用您看到的主要功能驱动它的基本部分时,它遇到了很大的错误。例如,我分别为a和b输入200和100,为d,e和f输出201,1和3。目前的情况是,只有当我试图将c的值赋给它时,才会出现_tignificant。

3 个答案:

答案 0 :(得分:0)

原始代码中的行i - 1;看起来非常可疑。您想写i -= 1;还是--i;还是其他什么?

它将i递减1然后抛弃结果。

答案 1 :(得分:0)

我现在唯一能看到的错误是,当输入为零时,_significant未初始化。

在调试器中逐步执行它,确保正确的数字在数组中结束,并且数组数据未被意外覆盖。

编辑:It works for me (cleaned up slightly)。更清理,也工作:http://ideone.com/MDQF8

答案 2 :(得分:0)

如果您的类纯粹通过分配成员变量而被破坏,那意味着堆栈损坏毫无疑问。虽然我无法随意查看源代码,但您应该使用自行长度检查类替换所有缓冲区以验证访问。