Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2013, 21:32   #1
Bitter_Schokolade
Несчастный студент
Пользователь
 
Аватар для Bitter_Schokolade
 
Регистрация: 31.03.2013
Сообщений: 52
По умолчанию Наследование. Полиморфизм. Передача параметров. C++

Помогите, пожалуйста, разобраться, почему программа летит при таком коде (конкретно: не работает второй грузовик, на типе кузова программа падает):

Код:
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
using namespace std;
class Avto
{
private:
    char *Marka;
    int Cilindr;
    int Moshnost;
public:
    Avto()
    {
        Marka = new char [200];
        Cilindr = 0;
        Moshnost = 0;
    }
    virtual void Vvod()
    {
        cout<<"Vvedite marku: "<<endl;
        cin.getline(Marka, 20);
        cout<<"Vvedite chislo cilindrov dvigatelja: "<<endl;
        cin>>Cilindr;
        cout<<"Vvedite moshnost: "<<endl;
        cin>>Moshnost;
    }
    virtual void Pechat()
    {
        cout<<endl;
        cout<<"Avtomobil classa: "<<endl;
        cout<<"Marka avtomobilja: "<<Marka<<endl;
        cout<<"Chislo cilindrov dvigatelja: "<<Cilindr<<endl;
        cout<<"Moshnost: "<<Moshnost<<endl;
        cout<<endl;
    }
    ~Avto()
    {
        delete Marka;
    }
};
class Gruz: public Avto
{
private:
    char *Marka;
    int Cilindr;
    int Moshnost;
    char *Kuzov;
    float Objem;
public:
    Gruz()
    {
		Marka = new char [200];
		Cilindr = 0;
		Moshnost = 0;
		Kuzov = new char [200];
		Objem = 0.0;
    }
    Gruz(char *Tip, float GruzObjem)
    {
        Marka = new char [200];
        Cilindr = 0;
        Moshnost = 0;
        Kuzov = new char [200];
        Objem = 0.0;
        Kuzov=Tip;
        Objem=GruzObjem;
    }
    virtual void Vvod()
    {
        cin.ignore(10, '\n');
        cout<<"Vvedite marku gruzovika: "<<endl;
        cin.getline (Marka, 20);
        cout<<"Chislo cilindrov dvigatelja gruzovika: "<<endl;
        cin>>Cilindr;
        cout<<"Vvedite moshnost dvigatelja gruzovika: "<<endl;
        cin>>Moshnost;
        cin.ignore(10, '\n');
        cout<<"Vvedite tip kuzova: "<<endl;
        cin.getline(Kuzov, 20);
        cout<<"Vvedite gruzopodjemnost: "<<endl;
        cin>>Objem;
    }
    virtual void Pechat()
    {
        cout<<endl;
        cout<<"Gruzovik classa: "<<endl;
        cout<<"Marka gruzovika: "<<Marka<<endl;
        cout<<"Chislo cilindrov dvigatelja: "<<Cilindr<<endl;
        cout<<"Moshnost: "<<Moshnost<<endl;
        cout<<"Tip kuzova: "<<Kuzov<<endl;
        cout<<"Gruzopodjemnost: "<<Objem<<endl;
        cout<<endl;
    }
    virtual void Vvod(char *Tip, float GruzObjem)
    {
        cin.ignore(10, '\n');
        cout<<"Vvedite marku gruzovika: "<<endl;
        cin.getline (Marka, 20);
        cout<<"Chislo cilindrov dvigatelja gruzovika: "<<endl;
        cin>>Cilindr;
        cout<<"Vvedite moshnost dvigatelja gruzovika: "<<endl;
        cin>>Moshnost;
        cin.ignore(10, '\n');
        cout<<"Vvedite tip kuzova: "<<endl;
        cin.getline(Tip, 20);
        cout<<"Vvedite gruzopodjemnost: "<<endl;
        cin>>GruzObjem;
    }
    virtual void Pechat(char *Tip, float GruzObjem)
    {
        cout<<endl;
        cout<<"Gruzovik classa: "<<endl;
        cout<<"Marka gruzovika: "<<Marka<<endl;
        cout<<"Chislo cilindrov dvigatelja: "<<Cilindr<<endl;
        cout<<"Moshnost: "<<Moshnost<<endl;
        cout<<"Tip kuzova: "<<Tip<<endl;
        cout<<"Gruzopodjemnost: "<<GruzObjem<<endl;
        cout<<endl;
    }
    ~Gruz()
    {
        delete Marka;
        delete Kuzov;
    }
};

int main()
{
    Avto *a = new Avto();
    a->Vvod();
    a->Pechat();
    Gruz *g1 = new Gruz();
    g1->Vvod();
    g1->Pechat();
    Gruz *g2 = new Gruz("samosval", 4000.0);
    g2->Vvod("samosval", 4000.0);
    g2->Pechat("samosval", 4000.0);

    system ("pause");
    return 0;
}
Подозреваю, что ошибка кроется в передаче параметров.

Сама задача вот:
Создать класс «автомобиль», имеющий марку (указатель на строку),
число цилиндров двигателя, мощность. Определить конструкторы,
деструктор и функцию печати. Создать public-производный класс –
«грузовики», имеющий грузоподъемность и тип кузова. Определить
конструкторы по умолчанию и с разным числом параметров,
деструкторы, функцию печати. Определить функции переназначения
марки и грузоподъемности.

Последний раз редактировалось Bitter_Schokolade; 06.04.2013 в 21:41.
Bitter_Schokolade вне форума Ответить с цитированием
Старый 06.04.2013, 22:03   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Во-первых убери дублирующиеся поля из наследника. Сделай их protected в базовом классе.
Во-вторых строки типа char* нельзя присваивать через = (в результате получится не то, что тебе было нужно). Используй для этого strncpy.

Ну а в-третьих - да, падает из-за того что в delete попадают не те указатели. А еще из-за того что деструктор базового класса удаляет неинициализированный указатель.
Son Of Pain вне форума Ответить с цитированием
Старый 06.04.2013, 22:47   #3
Bitter_Schokolade
Несчастный студент
Пользователь
 
Аватар для Bitter_Schokolade
 
Регистрация: 31.03.2013
Сообщений: 52
По умолчанию

Спасибо, проблема решена, осталось узнать: strncpy как использовать (константная ссылка там какая нужна?)
Bitter_Schokolade вне форума Ответить с цитированием
Старый 06.04.2013, 23:13   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
strncpy(Kuzov, Tip, 199);
Kuzov[199] = 0;
Википедия
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
наследование и полиморфизм в ооп IRONHIDE C++ Builder 1 29.01.2013 12:39
Литература(наследование,полиморфизм ) kineziz Общие вопросы C/C++ 2 23.06.2012 21:10
Наследование, полиморфизм Matrix6993 Общие вопросы Delphi 1 18.03.2012 12:53
ООП (наследование и полиморфизм) Shadow94 Общие вопросы C/C++ 4 21.11.2011 00:01
ОоП полиморфизм ... наследование ... Xsires Общие вопросы Delphi 2 04.09.2011 15:38