Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 87
1

При вводе данных в объект программа аварийно завершается

26.12.2019, 09:03. Показов 1363. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. В процессе выполения лаб.работы столкнулась с такой проблемой. Вот мое задание: создать файлы main.h и main.cpp. В файле main.h определить с помощью ключевого слова class объект Ship, описать конструктор объекта, аргументы которого будут инициализировать все данные объекта. Описать конструктор объекта по умолчанию (без аргументов), проинициализировав все данные. Описать в объекте функцию void Print() с открытым уровнем доступа (public), которая будет выводить данные на экран.
В main.cpp определить конструктор объекта, инициализирующий все данные объекта значениями аргументов. В теле конструктора используем функцию strcpy (стр1, стр2) для копирования строки наименования корабля. Затем определить функцию void SHIP::Print(). Далее создать главную функцию программы int main(). Внутри нее создать объект SHIP, указав все значения данных объекта. Вывести данные объекта на экран, вызвав функцию Print. Далее создать динамический объект SHIP с помощью обычного конструктора и оператора new. Вывести данные объекта на экран и удалить его с помощью оператора delete. Затем написать функцию ввода данных в объект с клавиатуры void Person::Input(). (у меня не получилось ее сразу написать в .cpp и я поступила с ней аналогично Print). И затем создать объект SHIP с помощью конструктора по умолчанию и ввести данные в объект с клавиатуры, вызвав функцию Input (у меня это строчки 40-43). Вот тут у меня ничего не получается, VS выдает ошибку программы и просто закрывается.
Прошу помощи у Вас.




main.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using namespace std;
 
#include <iostream>
class Ship
{
private:
    char* name;
    int displacement;
    char* type;
 
public:
    Ship (const char* valueName, int valueDisplacement, const char* valueType); // конструктор с параметрами
    
    Ship () // конструктор по умолчанию
    {
        name = 0; 
        displacement = 0; 
        type = 0;
    }
 
    void Print(); // функция вывода данных на экран
 
    void Input(); // функция ввода данных с клавиатуры
};
main.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using namespace std;
#define _CRT_SECURE_NO_WARNINGS
 
#include <cstdlib>
#include <string>
#include <iostream>
#include "main.h"
 
 
Ship::Ship(const char* valueName, int valueDisplacement, const char* valueType) //конструктор с параметрами
{
    name = new char[strlen(valueName) + 1];
    strcpy(name, valueName);
    displacement = valueDisplacement;
    type = new char[strlen(valueType) + 1];
    strcpy(type, valueType);
};
 
void Ship:: Print() // функция вывода данных на экран
{
    cout << "\nНаименование\t" << name << "\nВодоизмещение\t" << displacement << "\nТип\t\t" << type << endl;
}
 
void Ship:: Input () // функция ввода данных с клавиатуры
{
    cin >> name >> displacement >> type ;
}
 
int main()
{
    setlocale(LC_ALL, "RU");
     Ship firstship("Титаник", 52310, "пассажирский");
     firstship.Print();
 
     Ship *Ship1;
     Ship1 = new Ship("Аврора", 6731, "крейсер");
     Ship1->Print();
     delete Ship1;
    
    Ship *Ship2;
    Ship2 = new Ship();
    Ship2->Input();
    Ship2->Print();
    
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.12.2019, 09:03
Ответы с готовыми решениями:

Программа завершается аварийно при вызове функции
Делаю консольное приложение на шестом Билдере. Не могу найти ошибку.Убил день. Прога компилиться...

Программа аварийно завершается при прохождении цикла
QVector&lt;int&gt; Set; QPair &lt;int,int&gt; Map; int c=0,Num,; srand(time(NULL)); ...

При открытия файла аварийно завершается программа
Пишу меди плеер , при открытия файла программа завершаться аварийно, вот код программы using...

программа завершается аварийно
запускаю компилятор, все запустилось, работает (меню из кучи условий if-else). выбираю любой пункт...

12
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
26.12.2019, 10:00 2
Цитата Сообщение от Ann1984 Посмотреть сообщение
Вот тут у меня ничего не получается, VS выдает ошибку программы и просто закрывается.
Цитата Сообщение от Ann1984 Посмотреть сообщение
using namespace std;
#include <iostream>
Цитата Сообщение от Ann1984 Посмотреть сообщение
using namespace std;
#define _CRT_SECURE_NO_WARNINGS
#include <cstdlib>
#include <string>
#include <iostream>
#include "main.h"
Для начала убери using namespace std; из main.h, а в main.cpp сделай его после инклудов
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,714
26.12.2019, 10:07 3
Цитата Сообщение от Ann1984 Посмотреть сообщение
Ship2 = new Ship();
Ship2->Input();
Здесь Вы создаете объект с нулевыми указателями
и в методе input пытаетесь ввести данные в объекты, имеющий нулевые адреса.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Ship::Input() // функция ввода данных с клавиатуры
{
    if(name!=nullptr)
        cin >> name >> displacement >> type;// !!!!! размеры останутся старые
    else
    {
        char namet[100];
        int dt;
        char typet[100];
        cin >> namet >> dt >> typet;
 
        name = new char[strlen(namet) + 1];
        strcpy(name, namet);
        displacement = dt;
        type = new char[strlen(typet) + 1];
        strcpy(type, typet);
    }
}
0
6107 / 3461 / 1406
Регистрация: 07.02.2019
Сообщений: 8,794
26.12.2019, 10:08 4
Ann1984,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void Ship::Input() // функция ввода данных с клавиатуры
{
    char buf[256]{};
 
    if (cin >> buf)
    {
        delete[] name;
        name = new char[strlen(buf) + 1];
        strcpy(name, buf);
    }
 
    cin >> displacement;
 
    if (cin >> buf)
    {
        delete[] type;
        type = new char[strlen(buf) + 1];
        strcpy(type, buf);
    }
}
0
Модератор
2121 / 991 / 169
Регистрация: 23.07.2018
Сообщений: 3,328
Записей в блоге: 3
26.12.2019, 10:12 5
Кратко проблема в следующем:

C++
1
2
3
4
5
6
7
#include <iostream>
int main()
{
    char* name = 0; //  конструктор по умолчанию
 
    std::cin >> name; //  Ship::Input()
}
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
26.12.2019, 10:13 6
Лучший ответ Сообщение было отмечено Ann1984 как решение

Решение

Ann1984, у вас в задании нет ничего о том, какими должны быть поля объекта. Поэтому для вас лучше всего и понятнее будет не использовать самостоятельный контроль за памятью для полей, а использовать std::string.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <string>
 
class Ship
{
private:
    std::string name;
    int displacement;
    std::string type;
 
public:
    Ship (const char* valueName, int valueDisplacement, const char* valueType); // конструктор с параметрами
    
    Ship () // конструктор по умолчанию
    {  }
 
    void Print(); // функция вывода данных на экран
 
    void Input(); // функция ввода данных с клавиатуры
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Ship::Ship(const char* valueName, int valueDisplacement, const char* valueType) //конструктор с параметрами
    : name(valueName), displacement(valueDisplacement), type(valueType)
{ }
 
void Ship:: Print() // функция вывода данных на экран
{
    cout << "\nНаименование\t" << name << "\nВодоизмещение\t" << displacement << "\nТип\t\t" << type << endl;
}
 
void Ship:: Input () // функция ввода данных с клавиатуры
{
    cin >> name >> displacement >> type ;
}
Тогда работать будет тот Input, который у вас уже написан.
2
Модератор
2121 / 991 / 169
Регистрация: 23.07.2018
Сообщений: 3,328
Записей в блоге: 3
26.12.2019, 10:17 7
Так, несомненно, лучше, но тогда непонятно, зачем нужна strcpy()
0
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 87
26.12.2019, 15:25  [ТС] 8
politoto , это у меня было в задании. Нужно было в теле конструктора использовать функцию strcpy (стр1, стр2) для копирования строки наименования корабля.

Добавлено через 1 минуту
oleg-m1973 , спасибо за замечание, исправила.

Добавлено через 11 минут
oleg-m1973 и zss, спасибо за развернутые ответы, но учитывая мой уровень знаний, я до таких схем просто не могла бы додуматься. И сейчас, когда Вы все расписали, понимаю со скрипом.

Добавлено через 6 минут
DrOffset ,
Ship::Ship(const char* valueName, int valueDisplacement, const char* valueType) //конструктор с параметрами
: name(valueName), displacement(valueDisplacement), type(valueType)
не могли бы Вы объяснить, что означает вторая строчка?

Добавлено через 19 минут
Теперь программа дает ввести данные, но в окне вывода "Наименование", "водоизмещение" и "тип" написаны верно, а выводимые данные "наименование" и "тип" - просто набор символов. Но у меня вроде включена функция setlocale.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
26.12.2019, 15:35 9
Цитата Сообщение от Ann1984 Посмотреть сообщение
не могли бы Вы объяснить, что означает вторая строчка?
Это список инициализации конструктора.
0
85 / 34 / 20
Регистрация: 15.12.2019
Сообщений: 88
26.12.2019, 16:02 10
Цитата Сообщение от Ann1984 Посмотреть сообщение
Теперь программа дает ввести данные, но в окне вывода "Наименование", "водоизмещение" и "тип" написаны верно, а выводимые данные "наименование" и "тип" - просто набор символов. Но у меня вроде включена функция setlocale.
Попробуйте
C++
1
setlocale(LC_CTYPE, "rus"); SetConsoleCP(1251); SetConsoleOutputCP(1251);
вместо простого
C++
1
setlocale(LC_CTYPE, "rus");
0
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 87
27.12.2019, 08:48  [ТС] 11
nyaka_wai , у меня компилятор ругается, пишет, что "идентификатор SetConsoleCP не определен" и то же самое с SetConsoleOutputCP.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
27.12.2019, 11:15 12
Ann1984, #include <windows.h>
1
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 87
27.12.2019, 14:48  [ТС] 13
DrOffset,
Ann1984, #include <windows.h>
спасибо, теперь буду знать.
0
27.12.2019, 14:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.12.2019, 14:48
Помогаю со студенческими работами здесь

Программа аварийно завершается
Доброго времени суток! Моя программа аварийно завершается вернув значение &quot;255 (0xFF)&quot; Прошу...

Рекурсия, почему программа завершается аварийно?
Подскажите, почему не работает рекурсия?? #include &lt;iostream&gt; using namespace std; void fn(int...

Программа на других компьютерах завершается аварийно
Здравствуйте, у меня дикая проблема: я написал программу (кинуть код не могу, он очень большой,...

Работа с матрицами (программа завершается аварийно)
Помогите, на Си, не С++. Выдает другие значения, к тому же аварийно завершает программу Для...

Программа аварийно завершается после оператора scanf
Такая проблема. Я начинающий. Занимаюсь уже вторую неделю. Написал такой код, запускаю программа....

При вводе числа с плавающей точкой завершается программа
Вот код: #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;stdlib.h&gt; #include &lt;clocale&gt; /*...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru