Класс String. Перегрузка операторов

184
30 октября 2019, 19:50

Помогите найти ошибку в коде.

Задание глобальное:"Создать класс String".

На одном из этапов надо добавить в класс метод int String::length(), который возвращает длину строки и перегрузить для класса операцию [] так, чтобы можно было обращаться и менять элементы строки: char& operator[] (int). С помощью указанных методов поменять местами первый и последний символы в строке.

Пример:

На входе: "Lorem Ipsum has been"

На выходе: "norem Ipsum has beeL"

#include <iostream>
#include <cstring>
using namespace std;
class String{
    int len;
    char *str;
public:
    String (): len(0), str(nullptr){}
    String(const String&src);
    String(const char *str);
    ~String();
    int length(String &);
    char& operator [](int index){
        return str[index];
    }
    friend istream &operator >>(istream &in, String &s);
    friend ostream &operator <<(ostream &out, String s);
};
String::String(const String &src){
    len = src.len;
    this->str = new char[len+1];
    strncpy(str, src.str, len);
    this->str[len] = '\0';
}
String::String(const char*str){
    len = strlen(str);
    this->str = new char*[len+1];
    strncpy(this->str, str, len);
    this->str[len] = '\0';
}
String::~String(){
    delete [] str;
}

int String::length(String &s){
    len = strlen(s.str);
    return len;
}
istream &operator >>(istream &in, String &s){
    char *buf = new char[100001];
    in.getlin(buf, 100000);
    s.len = strlen(buf);
    s.str = new char[s.len];
    for(int i = 0; i < s.len; ++i)
        s.str[i] = buf[i];
    delete [] buf;
    return in;
}
ostream &operator <<(ostream &out, String s){
    for(int i = 0; i < s.len; ++i)
        out << s.str[i];
    return out;
}
int main(){
    String s;
    cin >> s;
    char tmp = s[s.length];
    s[s.length] = s[0];
    s[0] = tmp;
    cout << s;
    return 0;
}
Answer 1

Кое-что несколько подзапущено...

Вот, смотрите. Я бы еще добавил запрет выхода за границу массива в операторе [].

#include <iostream>
#include <cstring>
using namespace std;
class String
{
    size_t len;
    char *str;
public:
    String (): len(0), str(nullptr){}
    String(const String&src);
    String(const char *str);
    ~String() { delete[] str; }
    size_t length() const { return len; };
    char& operator [](size_t index)
    {
        return str[index];
    }
    char operator [](size_t index) const
    {
        return str[index];
    }
    friend istream &operator >>(istream &in, String &s);
    friend ostream &operator <<(ostream &out, const String& s);
};
String::String(const String &src)
{
    len = src.len;
    this->str = new char[len+1];
    strcpy(str, src.str);
}
String::String(const char*s)
{
    len = strlen(s);
    str = new char[len+1];
    strcpy(str, s);
}
istream &operator >>(istream &in, String &s)
{
    char *buf = new char[100001];
    in.getline(buf, 100000);
    delete[] s.str;
    s.len = strlen(buf);
    s.str = new char[s.len+1];
    strcpy(s.str,buf);
    delete [] buf;
    return in;
}
ostream &operator <<(ostream &out, const String& s)
{
    return out << s.str;
}
int main()
{
    String s;
    cin >> s;
    char tmp = s[s.length()-1];
    s[s.length()-1] = s[0];
    s[0] = tmp;
    cout << s;
    return 0;
}
READ ALSO
Не компилируется GDI+ через cl.exe

Не компилируется GDI+ через cl.exe

Пытаюсь собрать пример скриншота на GDI+ на С++ через clexe Вот пример который я пытаюсь собрать

208
Результат a += a++

Результат a += a++

Почему после выполнения такого кода

180
Как вызвать метод клаcа(java)

Как вызвать метод клаcа(java)

Только начал изучать джавуПоследняя строчка выдает ошибку

202