Оператор in >> в собственном классе строк

106
25 марта 2022, 18:20

Реализовал класс строк, и сделал оператор >> , когда ввожу строчку с пробелами , например а а. аыаыв аы, то выводит только первый символ, то бишь 'а' , попытался сделать с temp , как показано ниже

istream& operator >> (istream& in, const String &ob) {
    String temp;
    temp.string = ob.string;
    in >> temp.string;
    return in;
}

Стал выдавать ошибку malloc: *** error for object 0x10051b2c0: pointer being freed was not allocated, компилятор указывает на деструктор Вот что написал в main

int main() {
    String a, b("Jaaasfg"), c ("Sb af bd");
    a = b;
    cout << a << endl;
    a = c ;
    cin >> a;
    cout << a;
    a = c;
    cout << a;
    return 0;

Вот всё описание класса:

String :: String (const char *str) {
    size = strlen(str) +1;
    string = new char [size];
    strcpy (string, str);
}
String :: String (const String &ob) {
    size = strlen(ob.string) +1;
    string = new char [size];
    strcpy (string, ob.string);
}
String :: ~String () {    delete [] string;
}
void String :: show () {
    cout << string << endl;
}
String String :: operator = (const String &ob) {
    if (string)
        delete [] string;
    size = strlen(ob.string) + 1;
    string = new char [size];
    strcpy(string,ob.string);
    return *this;
}
ostream& operator << (ostream& out , const String &ob) {
    out << ob.string;
    return out;
}
istream& operator >> (istream& in, const String &ob) {
    String temp;
    temp.string = ob.string;
    in >> temp.string;
    return in;
}

Определение класса:

#ifndef String_h
#define String_h
#include <iostream>
using namespace std;
class String {
    int size;
    char *string;
public:
    String (const char *str = "");
    String (const String &ob);
    ~String ();
    void show ();
    String operator = (const String &ob);
    friend ostream& operator << (ostream& out , const String &ob);
    friend istream& operator >> (istream& in, const String &ob);

};
#endif /* String_hpp */
Answer 1

Я оставил те части кода, где исправлены ошибки.

class String {
   //...
    String& operator = (const String& ob);
    //...
    friend istream& operator >> (istream& in,  String& ob);
};
String::String(const char* str = "") {
    //...
}
//...
String& String::operator = (const String& ob) {
    //...
}
//...
istream& operator >> (istream& in,  String& ob) {     
    in >> ob.string;
    ob.size = strlen(ob.string) + 1;//можно без этого
    //в идеале нужно выделять новую память, если вводимых символов больше
    return in;
}

Чтобы долго не обяснять, сами смотрите и сравнивайте.

P.S., для символьных строк можно определить метод, возвращающий размер, и не придется хранить размер size.

READ ALSO
Qt C++ фильтр для бд

Qt C++ фильтр для бд

необходимо сделать фильтр для бдЕсть поля в них нужно вписать значение, которое потом должно перейти в запрос и вывести результат в tableView

83
Добавление CURL в cmake проект | VS19 | Windows

Добавление CURL в cmake проект | VS19 | Windows

Имею следующий код в CMakeListstxt

167
Настрока компилятора в Qt

Настрока компилятора в Qt

Всем добрый деньСледующая

93
Инициализация структуры С и в С++

Инициализация структуры С и в С++

Есть структура вида

179