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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2008, 12:11   #1
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
Плохо С++ Производные классы (Ошибка)

Имеется Базовый класс:
int LEN=80;
class Admin_edin
{public:
Admin_edin();
private:
char name_Adm;
int num_grag;
float s_adm;
};
Admin_edin::Admin_edin{name_Adm[LEN], num_grag=s_adm=0;}

Производный
class Selo : public Admin_edin
{
public:
Selo (float);
Selo (float,char*, int, float);
float l_raj;
}
Selo ::Selo(l_raj, sname_Adm,[LEN], num_grag,s_adm):Admin_edin(sname_Ad m[LEN], snum_grag=ss_adm=0){l_ra=0;}
Выдается сообщение, что Selo ::Selo .. не в памяти.
Вроде все делаю по книге (учусь заочно, но сдвинуться с этого места не могу, подскажите где ошибка, пожалуйста
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 14.04.2008, 13:33   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Sweta Посмотреть сообщение
......подскажите где ошибка, пожалуйста
Вынужден огорчить - везде! Там места живого нет, что это за книжка такая? В печку её.

В первом (!) приближении можно сделать так:
Код:
const int LEN = 80;
//Имеется Базовый класс:

class CAdmin_edin
{
	public:
		CAdmin_edin();
	protected:
		char	name_Adm[LEN];
		int		num_grag;
		float	s_adm;
};

//Производный
class CSelo : public CAdmin_edin
{
	public:
		CSelo ();
		CSelo (float, char[LEN], int, float);
	private:
		float l_raj;
};

CAdmin_edin :: CAdmin_edin()
{
	num_grag = 0;
	s_adm = 0;
};

CSelo :: CSelo(float f_l_raj, char f_sname_Adm[LEN], int f_num_grag, float f_s_adm)
{
	num_grag	= f_num_grag;
	s_adm		= f_s_adm;
	l_raj		= f_l_raj;
	
	strncpy(name_Adm, f_sname_Adm, LEN);
}


int main()
{
	CSelo sl(10, "ABCDEF", 100, 1000);
//..............................................
	return 0;
}
B_N вне форума Ответить с цитированием
Старый 14.04.2008, 13:57   #3
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Большое спасибо!
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 22.04.2008, 13:06   #4
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

После всех исправлений вроде заработало, но если в main ставлю
Selo sel[3]; появляется ошибка компоновщика, что идет ссылка на несуществующий объект в Selo в файле .obj

//-------------------------------------------------------------------------
#pragma hdrstop

#pragma argsused
#include <iostream.h>
#include <conio.h>
//------- Базовый класс - Административная единица //
const int LEN=70; //Длина строки символов
class Admin_edin //Имя класса
{
protected: /Защищенные члены класса, доступные при наследовании
char name_admin [LEN]; //Наименование административной единицы
int num_man; //Кол-во жителей
float s_admin; // Площадь
float plotnost; //Плотность населения
public:
Admin_edin (); //Конструкторv
void GetAdmin(); //Ввод данных с клавиатуры
void PutAdmin()const; //Вывод данных
float Delenie(); //Определение плотности населения
};
//---------------- Методы класса
Admin_edin :: Admin_edin (){name_admin[LEN],num_man=s_admin=0;}void Admin_edin :: GetAdmin() //Ввод данных с клавиатуры
{
cout << "\n Vvedite naimenovanie:";
cin >> name_admin; //Ввод наименования населенноно пункта
cout << "\n Vvedite num_grajdan:";
cin >> num_man; //Ввод кол-ва жителей
// Проверка на положительное значение, присваивание 0, если введено
// отрицательное значение и предложение повторного ввода.
while(num_man<0)
{
num_man=0;
cout << "\n Vvedеno <0, Povtorite vvod:";
cout << "\n ";
cin >> num_man;
}

cout <<"\n Vvedite ploschad:";
cin >> s_admin; //Ввод площади
while(s_admin<0)
{
s_admin=0;
cout << "\n Vvedеno <0, Povtorite vvod S:";
cout << "\n ";
cin >> s_admin;
}
}
//----------------------------------------------------------------
// Вывод на экран
void Admin_edin :: PutAdmin()const
{
cout << endl
<< "\n Naimenovanie:" << name_admin
<< "\t Num_grajdan:" <<num_man
<< "\t Ploschad:" << s_admin; }
//Определение плотности населения
float Admin_edin :: Delenie()
{
plotnost = num_man/s_admin;
return plotnost; //Возврат результата
}

//----------------------- Производный класс - СЕЛО ---------------------
class Selo : public Admin_edin Admin_edin
{
public:
Selo (); //Конструктор без параметров
Selo (float, char[LEN], int, float);//Конструктор с 4-мя параметрами
void Sravnenie(Selo); //Метод сравнения сел по площади и кол-ву
void PutSelo()const; //Вывод на экран данных класса
void GetSelo();
private:
float l_raj; //Расстояние до районного центра
};

//---------------- Методы класса
Selo :: Selo(float f_l_raj, char f_sname_admin[LEN], int f_num_grag, float f_s_adm)
{
num_man = f_num_grag;
s_admin = f_s_adm;
l_raj = f_l_raj;
strncpy(name_admin, f_sname_admin, LEN);
}

//-------------------------------------------------------------------
void Selo :: Sravnenie(Selo s)
{int n1=num_man;
int n2=s.num_man;
if(n1>n2)
cout<<"\n Kolichestvo grajdan v "
<< name_admin
<< " bolshe na "
<< (n1-n2);
else cout<<"\n Kolichestvo grajdan v "<< s.name_admin << " bolshe na "
<< (n2-n1);

float s1=s_admin;
float s2=s.s_admin;
if(s1>s2)
cout<<"\n Ploschad "
<< name_admin
<< " bolshe na "
<< (s1-s2);
else cout<<"\n Ploschad "<< s.name_admin << " bolshe na "
<< (s2-s1);
}

//-------------------------------------------------------------------
//Ввод данных для обьекта Село
void Selo :: GetSelo()
{ Admin_edin::GetAdmin(); //Вызов функции из из класса Admin_edin
cout <<"\n Vvedite Rastojanie do rajcentra:" ;
cin >> l_raj;
while(l_raj<0)
{
l_raj=0;
cout << "\n Vvedеno <0, Povtorite vvod :";
cout << "\n ";
cin >> l_raj;
}
}

//-------------------------------------------------------------------
//Вывод данных для обьекта Село
void Selo :: PutSelo()const
{ Admin_edin::PutAdmin();
cout <<"\n Rasstojanie do rajcentra:" << l_raj ;
}




// Функция тестирующая работу Производного класса - Село
int main()
{
Selo s1(10.2, "Oskol", 302, 100.05);
s1.PutSelo();
cout<<"\n ";
s1.GetSelo();
s1.PutSelo();
Selo sel[3];
for (int i=0,n=1; i<3; i++,n++)
{
cout<<"\n Vvod dannih dlja Sel"<<n;
sel[i].GetSelo();
}
for (int i=0; i<3; i++)
{
sel[i].PutSelo();
}
cout<<"\n Press any key to end!";
getch();
return 0;
}
Неприятности приходят и уходят, а жизнь продолжается!

Последний раз редактировалось Sweta; 22.04.2008 в 14:15.
Sweta вне форума Ответить с цитированием
Старый 22.04.2008, 13:52   #5
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Sweta Посмотреть сообщение
После всех исправлений вроде заработало, но если в main ставлю
Selo sel[3]; появляется ошибка компоновщика, что идет ссылка на несуществующий объект в Selo в файле .obj
А где определения конструкторов для Admin_edin и Selo? Вижу только декларации, самих функций нет. Оформляйте листинги тэгом CODE (# в окне редактирования)
B_N вне форума Ответить с цитированием
Старый 22.04.2008, 14:16   #6
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

По моим представлениям выделила зеленым.
Еще одно, когда я строки с обьявлением массива и обращениям к функциям комментирую, т.е /*.....*/, то программа работает.
Неприятности приходят и уходят, а жизнь продолжается!

Последний раз редактировалось Sweta; 22.04.2008 в 14:27.
Sweta вне форума Ответить с цитированием
Старый 22.04.2008, 14:25   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Sweta Посмотреть сообщение
По моим представлениям выделила зеленым
Admin_edin() визуально наблюдаю. Раньше не заметил, что и немудрено, зачем Вы всё в одну строчку загоняете, чтобы быстрее запутаться? А конструктора Selo() нет, есть только конструктор "Selo (float, char[LEN], int, float);"
B_N вне форума Ответить с цитированием
Старый 22.04.2008, 14:31   #8
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Да не загоняла в одну строчку, это из-за спешки получилось, когда выделяла цветом. А Selo ведь должен быть пустым или я ошибаюсь?
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 22.04.2008, 14:39   #9
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Sweta Посмотреть сообщение
А Selo ведь должен быть пустым или я ошибаюсь?
У Вас в классе конструктор объявлен, а определения его в тексте - нет. Естественно, что линкер не в состоянии его найти.
B_N вне форума Ответить с цитированием
Старый 23.04.2008, 12:58   #10
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Все получилось. Большое спасибо!
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Классы в php Romanbl4 PHP 3 08.08.2008 07:09
Классы Старовъръ Общие вопросы Delphi 4 26.06.2008 17:00
базовые и производные классы (В чём моя ошибка) umnix Общие вопросы C/C++ 5 01.12.2007 17:26
Классы Mickle Общие вопросы Delphi 1 07.05.2007 12:16