Официальный сайт студ.городка НГТУ
Программирование и БД » [C++] Классы ошибки в программе 

#1  09.06.10 19:37

[C++] Классы ошибки в программе

есть файл Reservoirs.h

Код: cpp:

#include <iostream>
#include <conio.h>
 
using namespace std;
 
#include <stdio.h>
 
#define StringSize 50
 
 
class BaseReservoir
{
	char cName[StringSize];
	float fVolume;
public:
	BaseReservoir( void );
	BaseReservoir( char cN[StringSize], float fV )
	{
		int iIndex;
		for( iIndex = 0; cN[iIndex] != 0; iIndex++ )
			cName[iIndex] = cN[iIndex];
		cName[iIndex] = 0;
		fVolume = fV;
	};
 
	~BaseReservoir(){};
 
	void Scan( BaseReservoir a )
	{
		printf( "Enter the reservoir name\n" );
		gets( a.cName );
		printf( "Enter reservoir volume\n" );
		scanf( "%f", a.fVolume );
	}
 
	virtual void Print( BaseReservoir a )
	{
		printf( "Reservoir name: %s", cName );
		printf( "Reservoir volume: %f", fVolume );
	}
 
};
 
class NaturalReservoir: public BaseReservoir
{
	int iPercentOfCleanliness;
public:
	NaturalReservoir( int iP ): BaseReservoir()// char cN[StringSize], float fV )
	{
		iPercentOfCleanliness = iP;
	};
 
	~NaturalReservoir(){};
 
	void Print( BaseReservoir a )
	{
		BaseReservoir::Print();
		printf( "Percent of cleanliness of a reservoir: %d%%", iPercentOfCleanliness );
	}
};
 
class ArtificialReservoir: public BaseReservoir
{
	char cDate[StringSize];
public:
	ArtificialReservoir( char cD[StringSize] ): BaseReservoir()// char cN[StringSize], float fV )
	{
		int iIndex;
		for( iIndex = 0; cD[iIndex] != 0; iIndex++ )
			cDate[iIndex] = cD[iIndex];
	};
 
	~ArtificialReservoir(){};
 
	void Print( ArtificialReservoir a )
	{
		BaseReservoir::Print();
		printf( "Date of creation of a reservoir: %s", cDate );
	}
};


и main.cpp

Код: cpp:

#include "Reservoirs.h"
#include <stdio.h>
#include <conio.h>
 
void main()
{
	BaseReservoir a( "O\0" , 123 );
	a.Scan( a );
	a.Print( a );
 
	NaturalReservoir b( 40 );
	b.Print( b );
 
	ArtificialReservoir c( "12.12.2012" );
	c.Print( c );
 
	_getch();
}


есть ошибки которые я не пойму как исправить :(

Исправлено DaZzle (09.06.10 19:47)

Offline

#2  09.06.10 23:16

Re: [C++] Классы ошибки в программе

Код: cpp:

#include <iostream>
#include <conio.h>
 
using namespace std;
 
#include <stdio.h>
 
#define StringSize 50
 
 
class BaseReservoir
{
protected:
	char cName[StringSize];
	float fVolume;
public:
	BaseReservoir( void ){};
	BaseReservoir( char cN[StringSize], float fV )
	{
		int iIndex;
		for( iIndex = 0; cN[iIndex] != 0; iIndex++ )
			cName[iIndex] = cN[iIndex];
		cName[iIndex] = 0;
		fVolume = fV;
	};
 
	BaseReservoir(BaseReservoir& a)
	{
		int iIndex;
		for( iIndex = 0; a.cName[iIndex] != 0; iIndex++ )
			this->cName[iIndex] = a.cName[iIndex];
		this->cName[iIndex] = 0;
		fVolume=a.fVolume;
	};
 
	~BaseReservoir(){};
 
	void Scan()
	{
		printf( "Enter the reservoir name\n" );
		gets( cName );
		printf( "Enter reservoir volume\n" );
		scanf( "%f", &fVolume );
	};
 
	virtual void Print()
	{
		printf( "Reservoir name: %s", cName );
		printf( "Reservoir volume: %f", fVolume );
	};
 
};
 
class NaturalReservoir: public BaseReservoir
{
	int iPercentOfCleanliness;
public:
	NaturalReservoir( int iP,BaseReservoir& a ): BaseReservoir(a)// char cN[StringSize], float fV )
	{
		iPercentOfCleanliness = iP;
	};
 
	~NaturalReservoir(){};
 
	void Print()
	{
		BaseReservoir::Print();
		printf( "Percent of cleanliness of a reservoir: %d%%", iPercentOfCleanliness );
	};
};
 
class ArtificialReservoir: public BaseReservoir
{
	char cDate[StringSize];
public:
	ArtificialReservoir( char cD[StringSize],BaseReservoir& a ): BaseReservoir(a)// char cN[StringSize], float fV )
	{
		int iIndex;
		for( iIndex = 0; cD[iIndex] != 0; iIndex++ )
			cDate[iIndex] = cD[iIndex];
		cDate[iIndex]=0;
	};
 
	~ArtificialReservoir(){};
 
	void Print()
	{
		BaseReservoir::Print();
		printf( "Date of creation of a reservoir: %s", cDate );
	};
};

Код: cpp:

#include "Header.h"
#include <stdio.h>
#include <conio.h>
 
void main()
{
	BaseReservoir a( "O\0" , 123 );
	a.Scan();
	a.Print();
 
	NaturalReservoir b( 40 ,a);
	b.Print();
 
	ArtificialReservoir c( "12.12.2012" ,a);
	c.Print();
 
	_getch();
}

Можно и так. Код ужасный, но, вроде, работает.

Исправлено Revenger (09.06.10 23:17)

Offline

#3  09.06.10 23:26

Re: [C++] Классы ошибки в программе

Revenger, ты такой умный!
А на каком языке программирования это?

Исправлено Lunat1k (09.06.10 23:26)

Offline

#4  09.06.10 23:36

Re: [C++] Классы ошибки в программе

Lunat1k написал(а):

Revenger, ты такой умный!

С чего ты взял?
Язык С++

Offline

#5  09.06.10 23:51

Re: [C++] Классы ошибки в программе

Revenger, Блиин спасибо большушее)
Я уже всю голову поломал шожеделать)

Offline

#6  10.06.10 00:00

Re: [C++] Классы ошибки в программе

DaZzle, не за что. А вообще код изначально странный.
Зачем передавать методу класса объект самого этого же класса?

Offline

#7  10.06.10 00:08

Re: [C++] Классы ошибки в программе

Revenger, теперь у меня другая проблема я когда пытаюсь обратится к функции ввода то есть к скану из маине он почему-то пропускает строчку ввода Имени

Код: cpp:

void main()
{
	BaseReservoir a;
	a.Scan();
 	NaturalReservoir a1( 40 , a );
	a1.Print();
 
	BaseReservoir c;
	c.Scan();
	ArtificialReservoir c1( "12.12.2012" , c );
	c1.Print();
 
	_getch();
}

Offline

#8  10.06.10 00:11

Re: [C++] Классы ошибки в программе

Где конкретно он чего пропускает? у меня такой код работал.
Я уже закрыл вижак. поясни на пальцах чего не работает.

Offline

#9  10.06.10 00:13

Re: [C++] Классы ошибки в программе

ну вот смотри, мне нужно ввести как бы два названия и объёма, но вместе с первыми данными о имени и объёми он должен вставить процент чистоты, а для вторых должен вывести дату созданию, и вот когда я обращаюсь к скану второй раз ну то есть  BaseReservoir c; c.Scan(); он строчку ввода имени пропускает и сразу вводит объём. следовательно второй вывод получается без имени

Offline

#10  10.06.10 00:25

Re: [C++] Классы ошибки в программе

Я ж говорю код изначально косячный, но переписывать все мне лениво
Код функции Scan в базовом классе(BaseReservoir):

Код: cpp:

void Scan()
	{
		printf( "Enter the reservoir name\n" );
		fflush(stdin);
		gets( cName );
		printf( "Enter reservoir volume\n" );
		scanf( "%f", &fVolume );
	};

Попробуй так

Исправлено Revenger (10.06.10 00:25)

Offline

#11  10.06.10 00:27

Re: [C++] Классы ошибки в программе

Revenger, Да, Я и не прошу всё переписывать, за что ты вообще помог громадное спасибо)
Да сейчас подставил такую функцию всё в порядке)
Ещё раз спасибо)

Offline

#12  10.06.10 00:38

Re: [C++] Классы ошибки в программе

Не за что. И все-таки

Revenger написал(а):

Зачем передавать методу класса объект самого этого же класса?

Offline

#13  10.06.10 00:42

$up
Профиль

Re: [C++] Классы ошибки в программе

Просто DaZzle не понимает что такое наследование и для чего оно нужно.
Ну и чтобы смешнее было.
Можно было бы ещё спросить, почему у него деструктор не виртуальный 8)

Исправлено $up (10.06.10 00:45)

Offline

#14  10.06.10 00:47

Re: [C++] Классы ошибки в программе

Если уж там есть std, то тогда стоило использовать cin,cout,string. Тогда меньше бы ошибок было.

$up написал(а):

Просто DaZzle не понимает что такое наследование и для чего оно нужно.
Ну и чтобы смешнее было.

Да ладно тебе. Все делают ошибки.

Offline

#15  10.06.10 01:05

Re: [C++] Классы ошибки в программе

$up написал(а):

Можно было бы ещё спросить, почему у него деструктор не виртуальный 8)

Ну зачем же?

Offline

#16  10.06.10 01:05

$up
Профиль

Re: [C++] Классы ошибки в программе

Revenger написал(а):

Все делают ошибки

тут не ошибки, а непонимание основ.
Никто не создаёт экземпляр класса лишь затем, чтобы отдать в конструктор наследнику.

Offline

#17  10.06.10 01:07

$up
Профиль

Re: [C++] Классы ошибки в программе

Revenger написал(а):

Ну зачем же?

на всякий случай 8)

сделал же он Print() виртуальной без всякой причины 8)

Offline

#18  10.06.10 01:09

Re: [C++] Классы ошибки в программе

$up написал(а):

Можно было бы ещё спросить, почему у него деструктор не виртуальный 8)

Зачем?

Offline

#19  10.06.10 01:09

Re: [C++] Классы ошибки в программе

$up написал(а):

Никто не создаёт экземпляр класса лишь затем, чтобы отдать в конструктор наследнику.

Я понимаю. Но техзадание стояло - исправить, чтоб работало. Ошибки компиляции убрал - тз выполнено)))
Но ведь можно же отдать экземпляр класса конструктору наследника. возникает ведь такая необходимость.

Offline

#20  10.06.10 01:10

Re: [C++] Классы ошибки в программе

Lunat1k написал(а):

Зачем?

Затем, чтобы при полиморфизме деструкторы наследников корректно вызвались

Offline

#21  10.06.10 01:11

Re: [C++] Классы ошибки в программе

$up написал(а):

на всякий случай 8)

Да я хотел сказать - зачем спрашивать. Нужно уж тогда разъяснять все с нуля.

Offline

#22  10.06.10 01:12

Re: [C++] Классы ошибки в программе

Revenger написал(а):

Затем, чтобы при полиморфизме деструкторы наследников корректно вызвались

А, тогда тут всё понятно

Offline

#23  10.06.10 01:13

$up
Профиль

Re: [C++] Классы ошибки в программе

медленно отвечаю 8)

Исправлено $up (10.06.10 01:13)

Offline

#24  10.06.10 01:18

Re: [C++] Классы ошибки в программе

Lunat1k написал(а):

А, тогда тут всё понятно

Что же тебе понятно?
пример

Код: cpp:

class Base
{
  private:
    char *sp1;
  public:
    Base(const char *S)  { sp1=strdup(S); } 
    ~Base()              { delete sp1; } 
};
 
class Derived: public Base
{
  private:
    char *sp2;
  public:
    Derived(const char *S1, const char *S2): Base(S1)
                { sp2=strdup(S2); } 
    ~Derived()  { delete sp2; }    
};


Как сработает вот это

Код: cpp:

Base *pBase; 
pBase=new Derived("string 1", "string 2");
delete pBase;


И в чем будет отличие, если деструктор Base был бы виртуальным?

Исправлено Revenger (10.06.10 01:49)

Offline

#25  10.06.10 01:43

$up
Профиль

Re: [C++] Классы ошибки в программе

delete pBase;
забыл

Offline

#26  10.06.10 01:50

Re: [C++] Классы ошибки в программе

$up написал(а):

delete pBase;

Точно. Практически чистый Си дает о себе знать

Offline

#27  11.06.10 09:50

Re: [C++] Классы ошибки в программе

Revenger, ты бы уже объяснил :) я не знаю

Offline

#28  11.06.10 10:01

Re: [C++] Классы ошибки в программе

Banzzaj написал(а):

Revenger, ты бы уже объяснил :) я не знаю

Ты пошутил, или серьёзно?

Revenger написал(а):

Затем, чтобы при полиморфизме деструкторы наследников корректно вызвались

В нашем примере, pBase указатель на Base, но объект должен вести себя как Derived. И конечно при вызове деструктора этого объекта, ты хочешь уничтожит именно его. Но без virtual destructor вызовется только деструктор объекта Base(откуда компилятору знать тип объекта по указателю). И у тебя получается утечка памяти. С virtual destructor все пройдет корректно и вызовутся деструкторы как Base так и Derived. Память никуда не утечет.
З.Ы. Как то кривовато я объяснил.

Offline

#29  11.06.10 10:13

Re: [C++] Классы ошибки в программе

Revenger, на таком уровне-то я в курсе :) а конкретно не подскажешь что происходит при определении деструктора как виртуального? то есть там же таблица какая-то создается при компиляции?

Offline

#30  11.06.10 12:50

Re: [C++] Классы ошибки в программе

При определении любой виртуальной функции объект класса увеличивается на указатель на таблицу виртуальных функций(vtable).
Вот тебе про таблицу - лень писать

http://ru.wikipedia.org/wiki/Таблица_ви … ых_методов

Исправлено Revenger (11.06.10 12:52)

Offline

Программирование и БД » [C++] Классы ошибки в программе 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.283 сек.
Выполнено 11 запросов.