Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Ошибка в коде C++

sshirtd acc Ученик (77), на голосовании 5 месяцев назад
 	// Ошибка, возникающая при возвращении объекта. 
#include
#include
#include
using namespace std;

class samp {
char *s;
public:
samp() { s = '\0'; }
~samp() { if(s) free(s); cout << "s освобождается" << endl; }
void show() { cout << s << endl; }
void set(char *str);
};

// Строка загружается.
void samp::set(char *str)
{
s = (char *) malloc(strlen(str)+1);
if (!s) {
cout << "Ошибка выделения места в памяти" << endl;
exit(1);
}
strcpy(s, str);
}

// возврат объекта типа samp.
samp input()
{
char s[80];
samp str;
cout << "Введите строку: ";
cin >> s;
str.set(s);
return str;
}

int main()
{
samp ob;
// попытка присвоить возвращаемый объект ob.
ob = input(); // Это приводит к ошибке!
ob.show();
return 0;
}
Вывод:
 main.cpp: In constructor ‘samp::samp()’: 
main.cpp:10:30: error: invalid conversion from ‘char’ to ‘char*’ [-fpermissive]
10 | samp() { s = '\0'; }
| ^~~~
| |
| char
Голосование за лучший ответ
Кто-то-Кот Профи (697) 6 месяцев назад
кавоо?
sshirtd accУченик (77) 6 месяцев назад
елан, себи с сайта нахй прочь
Кто-то-Кот Профи (697) sshirtd acc, что за c++
John Smith Гуру (4820) 6 месяцев назад
Ладно
sshirtd accУченик (77) 6 месяцев назад
елан, себи с сайта нахй прочь
Mr.Hale Профи (825) 6 месяцев назад
 #include  
#include
#include
using namespace std;

class samp {
char *s;
public:
samp() { s = nullptr; }
~samp() {
if(s) free(s);
cout << "s освобождается" << endl;
}
void show() {
if (s) cout << s << endl;
}
void set(const char *str);

// Конструктор копирования
samp(const samp &obj) {
if (obj.s) {
s = (char*)malloc(strlen(obj.s) + 1);
strcpy(s, obj.s);
} else {
s = nullptr;
}
}

// Оператор присваивания
samp& operator=(const samp &obj) {
if (this != &obj) {
if (s) free(s);
if (obj.s) {
s = (char*)malloc(strlen(obj.s) + 1);
strcpy(s, obj.s);
} else {
s = nullptr;
}
}
return *this;
}
};

// Строка загружается.
void samp::set(const char *str) {
s = (char *) malloc(strlen(str) + 1);
if (!s) {
cout << "Ошибка выделения места в памяти" << endl;
exit(1);
}
strcpy(s, str);
}

// возврат объекта типа samp.
samp input() {
char s[80];
samp str;
cout << "Введите строку: ";
cin >> s;
str.set(s);
return str;
}

int main() {
samp ob;
ob = input(); // Это теперь работает корректно.
ob.show();
return 0;
}
sshirtd accУченик (77) 6 месяцев назад
Послушай, взял с книги пример, сужденное приведенное ниже которая взаимосвязана с этой задачей, после исправления является корректным?
sshirtd accУченик (77) 6 месяцев назад
Вы должны быть осторожны при возврате объектов из функций, если эти объекты имеют деструктивные функции. Потому что, как только это значение возвращается, возвращаемый объект выходит за пределы области доступа.
Например, предположим, что объект, возвращаемый функцией, имеет деструктор, который освобождает его динамически выделенную память. Эта память будет освобождена, даже если объект, которому было присвоено возвращаемое значение, все еще использует его.
Похожие вопросы