我试图在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;
}
答案 0 :(得分:4)
你犯了几个错误:
operator=()
未分配或以其他方式确保num
足够大,您可以通过其[]
运算符向其写入字符。
operator=()
需要返回bign&
引用。否则,它会返回this
的副本。
您尚未实施复制构造函数(请参阅Rule of Three)。
请改为尝试:
#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];