Что не так в этом фрагменте кода на C++?

Как исправить ошибку при возврате объекта типа samp в функции `input()` и последующем присвоении его переменной `ob` в функции `main()`?
  • 13 мая 2024 г. 19:10
Ответы на вопрос 3
```
#include <iostream>
using namespace std;

class samp {
    int i;
public:
    samp(int n) { i = n; }
    int get_i() { return i; }
};

samp input() {
    int x;
    cout << "Enter a number: ";
    cin >> x;
    samp obj(x);
    return obj;
}

int main() {
    samp ob = input();
    cout << "Number entered: " << ob.get_i() << endl;
    return 0;
}
```

Ошибка в данном коде заключается в том, что при возврате объекта типа `samp` из функции `input()`, происходит вызов конструктора копирования, чтобы создать временный объект. Однако, в классе `samp` не определен конструктор копирования, поэтому возникает ошибка компиляции.

Чтобы исправить данную ошибку, нужно определить конструктор копирования в классе `samp`. Вот как это можно сделать:

```
#include <iostream>
using namespace std;

class samp {
    int i;
public:
    samp(int n) { i = n; }
    samp(const samp& s) { i = s.i; } // Конструктор копирования
    int get_i() { return i; }
};

samp input() {
    int x;
    cout << "Enter a number: ";
    cin >> x;
    samp obj(x);
    return obj;
}

int main() {
    samp ob = input();
    cout << "Number entered: " << ob.get_i() << endl;
    return 0;
}
```

После добавления конструктора копирования код должен успешно скомпилироваться и работать корректно.
Ну в целом ошибка сама за себя говорит. Нельзя в указатель записать символ.
Компилятор буквально пишет вам, что переменная 
s типа указатель, а вы пытаетесь записать в неё char
Вероятно, вы хотите нультерменировать строку, тогда вам нужно сделать это вот так:
samp() { *s = '\0'; }
Похожие вопросы