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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2009, 22:31   #1
olik83
Пользователь
 
Регистрация: 20.09.2009
Сообщений: 17
Вопрос класс employee и производные классы

всем доброго времени суток.
у меня случился ступор(
вопросов несколько:
-надо сделать счетчик в конструктор в эмплоии, который будет выдавать табельные номера сотрудникам. в коде обозван tabnumb. вот вопрос как его лучше реализовать
-для установки даты приема сотрудника подключила хиддер класса дата и объявила переменную этого же класса priem в эмплои. но почему-то компилятор на инициализации переменной в конструкторе эмплои очень ругается. не пойму почему(
-надо реализовать метод индексации зп. я предполагала, что буду сравнивать дату приема с настоящей датой и автоматически увеличивать уровень зп на 10%. но что-то совсем не пойму как это сделать.
код недоделанный, не успела еще перегрузить операторы ввода и вывода.
и еще куча вопросов по наследникам, но я до них еще не добралсь пока с базовым классом не разберусь окончательно(
вот, вобщм айнидхелп!
код cpp
Код:
 #include <iostream>
#include <cstring>
#include "stdafx.h"
#include "data.h"

class data;
class employee
{
public:
	employee(void);
	employee(char*,char*,char*,int,int, data);
	~employee(void);
	employee(employee&);
	static int set_tabnumb();
	employee& operator=(employee&);
	employee& new_firstname(employee&);
	employee& new_name(employee&);
	employee& index_zp(employee&);
	friend std::ostream& operator <<(std::ostream&, const employee&);
	friend std::istream& operator >>(std::istream&, employee&);
private:
	char* name; 
	char* firstname;
    int age;  
	char* position;  
    int zp;      
	static int tabnumb;
	int buff;
	data priem;
	data uvoln;
	employee* next;
};

#include "stdafx.h"
#include "employee.h"
#include "data.h"

employee::employee(void)
{
}
employee::employee(char *n, char *fn, char *p, int zzp, int a, data dd):zp(zzp), age(a) 
{
	priem.day=dd.day;
	priem.month=dd.month;
	priem.year=dd.year;
	buff=128;
	tabnumb=0;
	tabnumb=tabnumb+1;
	name=new char[buff];
	name=n;
	firstname=new char[buff];
	firstname=fn;
	position=new char[buff];
	position=p;
}
employee::~employee(void)
{
		delete [] name;
		delete [] firstname;
		delete [] position;
	
}
employee& employee::operator =(employee &ee)
{
	if (this == &ee)
		return *this;
	else 
	{
		age=ee.age;
		zp=ee.zp;
		delete [] name;
		delete [] firstname;
		delete [] position;
		name= new char[buff];
		firstname = new char [buff];
		position= new char [buff];
	}
strcpy(name,ee.name);
strcpy(firstname,ee.firstname);
strcpy(position,ee.position);
return *this;
}
employee& employee::new_firstname(employee &fn)
{	
	if (firstname == fn.firstname)
	{
		return *this;
	}
	else
	{
		firstname=fn.firstname;
		return *this;
	}
}
employee& employee::new_name(employee &fn)
{
	if (name == fn.name)
	{
		return *this;
	}
	else
	{
		name=fn.name;
		return *this;
	}
}
employee& employee::index_zp(employee &ee)
{
	employee temp;
	if ()
	return temp;
}
/*static int set_tabnumb()
{
	 tabnumb++;
}*/
olik83 вне форума Ответить с цитированием
Старый 21.09.2009, 18:35   #2
LaptevVV
Пользователь
 
Регистрация: 15.08.2009
Сообщений: 37
По умолчанию

1. Если уж до классов дошла, то вместо char *, пользуйся string - проблем будет значительно меньше. Для этого подключи <string> вместо <сstring>
2. Уникальный табельный номер реализуется статическим полем. При создании объекта поле увеличивается на 1.
3. А где реализация класса data? Пока я вижу только объявление класса. Поэтому компилер и ругается. При наличии объявления разрешается создавать указатели, но никак не объекты. А у тебя - объект priem типа data.
LaptevVV вне форума Ответить с цитированием
Старый 21.09.2009, 21:47   #3
olik83
Пользователь
 
Регистрация: 20.09.2009
Сообщений: 17
По умолчанию

LaptevVV,
вот полный листинг немного доработанный, но все равно не работающий((
первые два файла дата хиддер и реализация:
Код:
#pragma once
#include "stdafx.h"
# include <iostream>
#include <ctime>

class data{
public:
	int day;
	int month;
	int year;
	data(void);
	~data(void);
	data(int&,int&, int&);
	int razn(data&);
	data& set_data(data&);
	friend std::ostream& operator <<(std::ostream&, const data&);
	friend std::istream& operator >>(std::istream&, data&);
};
----------------------
#include "stdafx.h"
#include <ctime>
#include "data.h"
using namespace std;

data::data(void)
{
	struct tm *ptr;
	time_t t;
	time (&t);
	ptr=localtime(&t);
	month=(int) ptr->tm_mon+1;
	year=(int) ptr->tm_year+1900;
	day=(int) ptr->tm_mday;
}

data::~data(void)
{
}
data::data(int &d, int &m, int &y)
{
	day=d;
	month=m;
	year=y;
}
int data::razn(data &dd)
{
	int y,m,d;
	y=dd.year-year;
	m=dd.month-month;
	d=dd.day-day;
	return (y*365+m*31+d);
}
std::ostream& operator<<(ostream& os, const data& dd)
{
	switch(dd.month)
	{
		case (1): os<<dd.day<<"January"<<dd.year; break;
		case (2): os<<dd.day<<"February"<<dd.year; break;
		case (3): os<<dd.day<<"March"<<dd.year; break;
		case (4): os<<dd.day<<"April"<<dd.year; break;
		case (5): os<<dd.day<<"May"<<dd.year; break;
		case (6): os<<dd.day<<"June"<<dd.year; break;
		case (7): os<<dd.day<<"Jule"<<dd.year; break;
		case (8): os<<dd.day<<"August"<<dd.year; break;
		case (9): os<<dd.day<<"September"<<dd.year; break;
		case (10): os<<dd.day<<"October"<<dd.year; break;
		case (11): os<<dd.day<<"November"<<dd.year; break;
		case (12): os<<dd.day<<"December"<<dd.year; break;
		default: os<<"error!"<<endl; break;
	}
return os;
}
std::istream& operator >>(istream& is, data& dd)
{
	is>>dd.day>>dd.month>>dd.year;
	return is;
}
вот сам эплои:
Код:
#pragma once
#include "stdafx.h"
#include <iostream>
#include <cstring>
#include "data.h"

class data;
class employee
{
	char* name; 
	char* firstname;
	int id;
    int age;  
	char* position;  
    float zp;      
	static int tabnumb;
	int buff;
	data *priem;
	data *uvoln;
	friend std::ostream& operator <<(std::ostream&, const employee&);
	friend std::istream& operator >>(std::istream&, employee&);
public:
	employee(void);
	employee(char*,char*,char*,float,int, data*);
	~employee(void);
	employee(employee&);
	static int set_tabnumb(int);
	employee& operator=(employee&);
	employee& new_firstname(employee&);
	employee& new_name(employee&);
	employee& index_zp(employee&);
};
-------------------------------------
#include "stdafx.h"
#include "employee.h"
#include "data.h"
using namespace std;

int employee::tabnumb = 0;
employee::employee(void)
{
}
employee::employee(char *n, char *fn, char *p, float zzp, int a, data *dd):zp(zzp), age(a) 
{
	priem=dd;
	buff=128;
	tabnumb=tabnumb+1;
	id=tabnumb;
	name=new char[buff];
	name=n;
	firstname=new char[buff];
	firstname=fn;
	position=new char[buff];
	position=p;
}
employee::~employee(void)
{
		delete [] name;
		delete [] firstname;
		delete [] position;
	
}
employee& employee::operator =(employee &ee)
{
	if (this == &ee)
		return *this;
	else 
	{
		age=ee.age;
		zp=ee.zp;
		delete [] name;
		delete [] firstname;
		delete [] position;
		name= new char[buff];
		firstname = new char [buff];
		position= new char [buff];
	}
strcpy(name,ee.name);
strcpy(firstname,ee.firstname);
strcpy(position,ee.position);
return *this;
}
employee& employee::new_firstname(employee &fn)
{	
	 if (firstname != fn.firstname)
        firstname=fn.firstname;
    return *this;
}
employee& employee::new_name(employee &fn)
{
	 if (name != fn.name)
        name=fn.name;
    return *this;
}
employee& employee::index_zp(employee &ee)
{
	employee temp;
	data *now;
	if (now == priem+12)
	{
		temp.zp=ee.zp + (ee.zp/10);
	}
	return temp;
}
std::ostream& operator<<(ostream& os,const employee& ee)
{
	os<<ee.id<<ee.firstname<<ee.name<<ee.position<<ee.age<<ee.zp<<ee.priem<<endl;
return os;
}
std::istream& operator>>(istream& is, employee& ee)
{
	if(ee.name && ee.firstname && ee.position) 
	{
		delete [] ee.name;
		delete [] ee.firstname;
		delete [] ee.position;
	}
	char sbuff[128];
    is.getline(sbuff,128);
    int buff_size=strlen(sbuff);
    ee.name= new char [buff_size+1];
	ee.firstname=new char [buff_size+1];
	ee.position=new char [buff_size+1];
	strcpy(ee.name,sbuff);
	strcpy(ee.firstname,sbuff);
	strcpy(ee.position,sbuff);
    ee.buff = buff_size;
    return is;
}
static int set_tabnumb(int tabnumb)
{
	tabnumb=tabnumb+1;
	return tabnumb;
}
а про стринг да, спасибо исправлю)
olik83 вне форума Ответить с цитированием
Старый 21.09.2009, 21:48   #4
olik83
Пользователь
 
Регистрация: 20.09.2009
Сообщений: 17
По умолчанию а вот и наследник

а вот и наследник менеджер собственной персоной, но вообще не рабочий:
Код:
#pragma once
#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <cstring>

class data;
class manager: public employee
{
	employee emp;   
    employee* group; 
	char* task_list;
	//friend std::ostream& operator<<(ostream&,const manager&);
	//friend std::istream& operator>>(istream&, manager&);
public:
	manager(char*,char*,char*,char*,float,int, data*, employee*);
	~manager();
};
----------------
#include "stdafx.h"
#include "employee.h"
#include "manager.h"

manager::manager(char*n,char*fn,char*p,char*tl,float zzp,int ag, data *dd, employee* g):
employee(char *n, char *fn, char *p, float zzp, int a, data *dd)
{
	int buff=1024;
	task_list=new char[buff];
	group=new employee[buff];
}
manager::~manager()
{
	delete [] task_list;
	delete [] group;
	//~employee();
} 
std::ostream& operator<<(ostream& os,const manager& mm)
{
	os<<employee::mm.age<<employee::mm.firstname<<mm.group<<mm.task_list<<endl;
return os;
}
std::istream& operator>>(istream& is, manager& mm)
{
	if (mm.firstname && mm.name && mm.group && mm.position && mm.task_list)
	{
		delete [] mm.firstname;
		delete [] mm.name;
		delete [] mm.position;
		delete [] mm.group;
		delete [] mm.task_list;
	}
	char sbuff[128];
    is.getline(sbuff,128);
    int buff_size=strlen(sbuff);
    mm.name= new char [buff_size+1];
	mm.firstname=new char [buff_size+1];
	mm.position=new char [buff_size+1];
	mm.group=new char [buff_size+1];
	mm.position=new char [buff_size+1];
	strcpy(mm.name,sbuff);
	strcpy(mm.firstname,sbuff);
	strcpy(mm.position,sbuff);
    mm.buff = buff_size;
    return is;
}
olik83 вне форума Ответить с цитированием
Старый 21.09.2009, 22:32   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Бегло просмотрел data и employee... из самых бросающихся в глаза:
Код:
employee::employee(char *n, char *fn, char *p, float zzp, int a, data *dd):zp(zzp), age(a) 
{
	priem=dd;
	buff=128;
	tabnumb=tabnumb+1;
	id=tabnumb;
	name=new char[buff];
	name=n;             // Это как понимать? Для копирования строки используйте strcpy(name, n);
	firstname=new char[buff];
	firstname=fn;      // strcpy(firstname, fn);
	position=new char[buff];
	position=p;         // strcpy(position, p);
}
Код:
std::ostream& operator<<(ostream& os,const employee& ee)
{
	os<<ee.id<<ee.firstname<<ee.name<<ee.position<<ee.age<<ee.zp<<*(ee.priem)<<endl; // priem - указатель, а Вы используете его как объект
return os;
}
ну и там ещё много ошибок... но исправив это, у меня по-крайней мере запустился код:
Код:
#include <iostream>
#include "employee.h"

int main()
{
	int day = 23;
	int month = 11;
	int year = 2003;
	data dat(day, month, year);
	employee sotr("Ivan", "Ivanov", "Ivanovich", 131, 36, &dat);

	std::cout << sotr << std::endl;

	return 0;
}
netrino вне форума Ответить с цитированием
Старый 21.09.2009, 22:36   #6
olik83
Пользователь
 
Регистрация: 20.09.2009
Сообщений: 17
По умолчанию

да. спасибо огромное!
сейчас исправлю))
olik83 вне форума Ответить с цитированием
Старый 21.09.2009, 22:40   #7
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Прочитайте-ка еще разок что такое наследование, а то я не сильно понимаю запись в производном классе менеджера
Код:
class manager: public employee
{
	employee emp;   //щито это О_о?!?!?!?
    employee* group; 
	char* task_list;
	//friend std::ostream& operator<<(ostream&,const manager&);
	//friend std::istream& operator>>(istream&, manager&);
public:
	manager(char*,char*,char*,char*,float,int, data*, employee*);
	~manager();
};
MaTBeu вне форума Ответить с цитированием
Старый 21.09.2009, 22:44   #8
olik83
Пользователь
 
Регистрация: 20.09.2009
Сообщений: 17
По умолчанию

Цитата:
Сообщение от MaTBeu Посмотреть сообщение
Прочитайте-ка еще разок что такое наследование, а то я не сильно понимаю запись в производном классе менеджера
Код:
	employee emp;   //щито это О_о?!?!?!?
а это я читала про наследование вот: http://www.cyberguru.ru/programming/...p3-page29.html
много подобных статей. с одним и тем же листингом.
почитаю еще обязательно. ибо, кажется, я на лекции все поняла, а вот начала делать и поняла, что ничего не поняла
olik83 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание класса человек, worker, employee kos403 Общие вопросы C/C++ 2 22.02.2009 11:35
Классы MaxiMILLION Помощь студентам 4 12.10.2008 14:05
С++ Производные классы (Ошибка) Sweta Помощь студентам 9 23.04.2008 12:58
базовые и производные классы (В чём моя ошибка) umnix Общие вопросы C/C++ 5 01.12.2007 17:26