类函数不保留变量的值

时间:2014-12-16 01:51:04

标签: c++ function class

我试图在c ++中实现一个类(bign)。在此类中,字符串用于保留数字的值。问题是,当我为bign对象a赋值(" 01234567")时,实际上没有保存该值。在DevCpp 5.6.1中运行时,字符串num不会在屏幕上打印。为什么会发生这种情况以及如何解决?谢谢。

#include<iostream>
#include<string>
#include<sstream>
using namespace std;
class bign {
    public:
       int len;
       string num;

       bign() {
            len = 0;
       }

       bign operator= (string s) {
            len = s.size();
            for(int i = 0; i < len; ++i) {
                num[i] = s[i];
                cout << num[i]; //It works well.
            }
            cout<< "num" << num << endl; //Here num disappears.
            return *this;
        }

};
int main() {
    bign a;
    a = "01234567";
    cout << a.len << " " << a.num << endl;
    return 0;
}

修改 该程序应该反转数字序列,以便进行精确的数值计算,因此应该以这种方式完成(但不使用字符串副本)。此外,复制构造函数和其他元素将在以后添加到程序中。修订后的计划如下。 operator =函数仍然具有索引超出范围的错误。

#include<iostream>
#include<string>
#include<sstream>
using namespace std;
class bign {
    public:
       int len;
       string num;

       bign() {
            len = 0;
       }

       bign& operator= (string s) {
            len = s.size();
            num.reserve(len);
            for(int i = 0; i < len; ++i) {
                num[i] = s[len - i - 1];
                cout << num[i]; 
            }
            cout<< "num" << num << endl; //Here num disappears.
            return *this;
        }           
};
int main() {
    bign a;
    a = "01234567";
    cout << a.len << " " << a.num << endl;
    return 0;
}

2 个答案:

答案 0 :(得分:4)

你犯了几个错误:

  1. operator=()未分配或以其他方式确保num足够大,您可以通过其[]运算符向其写入字符。

  2. operator=()需要返回bign&引用。否则,它会返回this副本

  3. 您尚未实施复制构造函数(请参阅Rule of Three)。

  4. 请改为尝试:

    #include<iostream>
    #include<string>
    #include<sstream>
    
    using namespace std;
    
    class bign {
    public:
        int len;
        string num;
    
        bign()
            : len(0)
        {
            cout << "(bign) len=0 num=''" << endl;
        }
    
        bign(const string &src) {
            : len(src.size()), num(src)
        {
            cout << "(bign) len=" << len << " num='" << num << "'" << endl;
        }
    
        bign(const bign &src)
            : len(src.len), num(src.num)
        {
            cout << "(bign) len=" << len << " num='" << num << "'" << endl;
        }
    
        bign& operator= (const bign &rhs) {
            len = rhs.len;
            num = rhs.num;
            cout << "(bign) len=" << len << " num='" << num << "'" << endl;
            return *this;
        }
    };
    
    int main()
    {
        bign a;
        a = "01234567";
        cout << "(main) len=" << a.len << " num='" << a.num << "'" << endl;
        return 0;
    }
    

答案 1 :(得分:1)

你应该像这样调用std :: string的函数:

  

num.push_back(S [1]);

而不是:

  

num [i] = s [i];