Задать вопрос
@MaratPetrov96

Как изменить атрибуты в объекте C++ через ввод?

Продолжаю по учёбе кодить на C++

В задании указано написать функцию ввода данных в объект с клавиатуры, затем создать объект с помощью конструктора по умолчанию и ввести данные в объект с помощью клавиатуры.

В общем, ввод работает, но либо программа завершается, либо не меняются параметры объекта

Ещё сообщает "warning C4700: local variable 'mark' used without having been initialized"

Microsoft Visual C++

#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;

class Car {
  private:
    char* marka;
    int power;
    float price;
  public:
    Car(char* m = "Renault", int pw = 150, float p = 1255000.0){
        marka = m;
        power = pw;
        price = p;
    };
  public:
    void Print(){
        cout << "Mark is " << marka << ", price equals " << price << ", power is " << power << endl;
    };
    void Input();
    };

void Car::Input(){
	char* mark;
    int pw;
    float price;
    cout << "Power of automobile: " << endl;
    cin >> pw;
    cout << "Price of automobile: " << endl;
    cin >> price;
    cout << "Mark of automobile: " << endl;
    cin >> mark;
	Car(mark,pw,price);
};

int main() {
Car default_;
Car ipnut;
Car example("Toyota",145,1205000.0);
example.Print();
default_.Print();
ipnut.Input();
ipnut.Print();
return 0;
}
  • Вопрос задан
  • 160 просмотров
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
Ошибка, очевидно, тут: cin >> mark;
У вас mark - это указатель (а не строка). При этом указатель никуда не указывает (не инициализирован). Следовательно память под чтение не выделена. Куда по вашему должна попадать прочитанная информация?
Напомню, что указатель это целое беззнаковое число (размером в 4 или 8 байт в зависимости от платформы, могут быть и другие варианты, но это больше экзотика), которое интерпертируется как адрес в памяти. Если в указателе мусор (как сейчас), то запись по этому указателю вызовет SEGFAULT при выполнении программы, вам повезло - компилятор сам заметил эту ошибку, с SEGFAULTом разбираться обычно труднее.

Но и это еще не все.
В следующей строке вы создаете временный объект Car с помощью вызова конструктора, после выхода из Input этот объект сразу уничтожается.

Вам нужно:
1. выделить память под marka. Лучше всего использовать не char*, а std::string, тогда память будет выделяться автоматически.
2. читать ввод не в mark, а в marka. То же самое и для других двух переменных класса.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы