模拟在c ++中使用基本字符串

时间:2013-02-25 14:23:19

标签: c++ string

我正在做一个小程序来模拟使用基本字符串。它目前无法持续运作。

在这种情况下,程序工作正常:

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;
}

2 个答案:

答案 0 :(得分:1)

a = w + 10 + " " + L"x" + 65.5不起作用,因为w不属于sstring类型,因此未使用operator+重载。尝试例如在前sstringa = 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 + " ";