我正在做一个小程序来模拟使用基本字符串。它目前无法持续运作。
在这种情况下,程序工作正常:
a = a+ w + 10 + " " + L"x" + 65.5 ;
但如果我用这种方式写同一句话,那么所有的工作都会变坏:
a = + w + 10 + " " + L"x" + 65.5 ;
有人能向我解释我的课程有什么问题吗?
class sstring {
public:
string s;
sstring() {s.assign("");}
template <class T>
sstring& operator=(T i) {
s = to_string( i );
return *this;
}
sstring& operator=(const char *i) {
s = i;
return *this;
}
sstring& operator=(const wchar_t *w) {
wstring ws = w;
s.assign ( ws.begin(),ws.end() );
return *this;
}
sstring& operator=(wstring w) {
s.assign ( w.begin(),w.end() );
return *this;
}
// *********************************************** +
template <class T>
sstring& operator+(T i) {
s.append( to_string( i ));
return *this;
}
sstring& operator+(const char *i) {
s.append(i);
return *this;
}
sstring& operator+(const wchar_t *i) {
wstring ws = i;
ws.assign(i);
string cs;
cs.assign ( ws.begin(),ws.end() );
s.append( cs );
return *this;
}
sstring& operator+(wstring w) {
string temp;
temp.assign( w.begin(),w.end() );
s.append ( temp );
return *this;
}
//*************************************************** <<
friend ostream& operator<<( ostream &out,sstring obj);
};
ostream& operator<<( ostream &out,sstring obj) {
out << obj.s;
return out;
}
int main(void) {
sstring a;
wstring w;
w = L"claudio";
a = "daffra";
a = a + w + 10 + " " + L"x" + 65.5;
cout << "\ns :" << a;
return 1;
}
答案 0 :(得分:1)
此a = w + 10 + " " + L"x" + 65.5
不起作用,因为w
不属于sstring
类型,因此未使用operator+
重载。尝试例如在前sstring
:a = sstring() + w + 10 + " " + L"x" + 65.5;
前加上。
答案 1 :(得分:0)
这两行将给出相同的结果:
int x;
x = x + 4;
x += 4;
您建议的备选行格式为:
x =+ 4;
PARSED 与:
相同x = +4;
我们看到的(虽然这可以为类重载):
x = 4;
如果它们实现了大多数人期望的正常行为,那么这也将适用于你的wstring和sstring类。从粗略扫描看,您似乎正在尝试保持这种行为。
其他评论:让我们看一下两个解析树。
a = a + 9 + " ";
这样做:
operator+(typeof(a), int);
operator+(typeof_previous_line, const char *);
你可能已经重载了你的类型+一个int,并且+一个const char *可以工作。
另一方面:
a += 9 + " ";
那样做:
operator+(int, const char *);
operator+=(typeof_previous_line);
您可能没有定义这两个操作中的第一个。对此的常见修复是将第一个项目强制转换为结果类型。如下所示:
a += sstring(9) + " "; // or
a += sstring() + 9 + " ";