进入运营商时程序的奇数输出?

时间:2011-05-25 01:54:28

标签: c++

我可能在这里遗漏了一些明显的东西。这是我的代码(我只是学习真正的C ++,我希望得到一些练习):

#include <iostream>
#include <cstring>

using namespace std;

class String {
private:
    char * value;
    int len;
    friend ostream & operator<<(ostream & os, String s);
public:
    String();
    String(const char * base);
    ~String();
    String operator+(String s);
    String operator*(int n);
    int length();
};

String::String() {
    this->value = new char[0];
    this->len = 0;
}

String::String(const char * base) {
    this->value = new char[this->len = strlen(base)];
    strcpy(this->value, base);
}

String::~String() {
    delete [] this->value;
}

int String::length() {
    return this->len;
}

String String::operator+(String s) {
    String n;
    delete [] n.value;

    cout << "Upon entering, I am: \"" << *this << "\"\n";

    n.value = new char[this->len + s.len];
    for(int i = 0; i < this->len; i++) {
        n.value[i] = this->value[i];
    }
    for(int i = 0; i < s.len; i++) {
        n.value[i + this->len] = s.value[i];
    }

    n.len = this->len + s.len;

    cout << "String::operator+(" << *this << ", " << s << ") succeeded with new value = \"" << n << "\"\n";

    return n;
}

String String::operator*(int n) {
    String s;
    delete [] s.value;

    s.value = new char[this->len * n];

    for(int i = 0; i < this->len * n; i++) {
        s.value[i] = this->value[i % this->len];
    }

    cout << "String::operator* succeeded with new value = \"" << s << "\"\n";

    return s;
}

ostream & operator<<(ostream & os, String s) {
    return os << s.value;
}

int main() {
    String s("Hello, world!");
    cout << s << "\nLength = " << s.length() << "\n\n";
    cout << (s + String("\n")) * 5;
    return 0;
}

字符串初始化并正确显示,但我的输出真的很奇怪;似乎进入运营商+,“你好,世界!”突然变成“x%r”?

C:\Users\Ryan\Documents\My Dropbox\C++ Projects>strings
Hello, world!
Length = 13

Upon entering, I am: "x%r"
String::operator+(x%r,
) succeeded with new value = "x%r"
String::operator* succeeded with new value = "╚%r"
─

3 个答案:

答案 0 :(得分:4)

试试这个:

ostream & operator<<(ostream & os, const String& s) {
    return os << s.value;
}

否则你应该为你的String类定义复制构造函数。

答案 1 :(得分:0)

您需要提供复制构造函数和赋值运算符。

答案 2 :(得分:0)

您的代码存在很多问题。

  1. 你在管理自己的记忆。如果可能的话,你应该避免这样做。
  2. 你总是忘记字符串有一个空终止符。为了容纳strin Hello, world!,你需要一个14字节而不是13字节的字符缓冲区。
  3. 你有一个len成员变量与strlen函数有效地完成相同的事情,除了对上面#1的不一致考虑。
  4. 您的字符串类没有复制构造函数,这会导致狂野指针并最终崩溃。
  5. 以下是您的代码的重构,非常有效。

    #define _CRT_SECURE_NO_WARNINGS
    
    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    class String {
    private:
        char * value;
    //    size_t len;
        friend ostream & operator<<(ostream & os, String s);
    public:
        String();
        String(const char * base);
        String(const String& rhs) 
        {
            value = new char[strlen(rhs.value)+1];
            strcpy(value,rhs.value);
        }
        ~String();
        String operator+(String s);
        String operator*(int n);
        size_t length();
    };
    
    String::String() {
        this->value = new char[0];
    }
    
    String::String(const char * base) {
        this->value = new char[strlen(base)+1];
        strcpy(this->value, base);
    }
    
    String::~String() {
        delete [] this->value;
    }
    
    size_t String::length() {
        return strlen(value);
    }
    
    String String::operator+(String s) {
        String n;
        delete [] n.value;
    
        cout << "Upon entering, I am: \"" << *this << "\"\n";
    
        n.value = new char[strlen(value)+strlen(s.value)+1];
        for(int i = 0; i < strlen(value); i++) {
            n.value[i] = this->value[i];
        }
        for(int i = 0; i < strlen(s.value); i++) {
            n.value[i + strlen(value)] = s.value[i];
        }
        n.value[strlen(value)+strlen(s.value)] = '\0';
    
        cout << "String::operator+(" << *this << ", " << s << ") succeeded with new value = \"" << n << "\"\n";
    
        return n;
    }
    
    String String::operator*(int n) {
        String s;
        delete [] s.value;
    
        s.value = new char[(strlen(value)*n)+1];
    
        for(int i = 0; i < strlen(value) * n; i++) {
            s.value[i] = this->value[i % strlen(value)];
        }
        s.value[strlen(value)*n] = '\0';
    
        cout << "String::operator* succeeded with new value = \"" << s << "\"\n";
    
        return s;
    }
    
    ostream & operator<<(ostream & os, String s) {
        return os << s.value;
    }
    
    int main() {
        String s("Hello, world!");
        cout << s << "\nLength = " << s.length() << "\n\n";
        cout << (s + String("\n")) * 5;
        return 0;
    }