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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2011, 20:35   #1
Niksan
Пользователь
 
Регистрация: 27.03.2011
Сообщений: 22
По умолчанию иерархия объектов

начнем, пожалуй:
иерархия Классов:
object:
-WH, Detail, IZD, Mech, Node;

иерархия объектов
WH<-IZD<-Mech<-Node<-Detail;

допустим в WH(склад) будут 2 IZD(изделия)
в классе object есть поле beg, указатель на связанный список. С помощью этого списка я реализую включение объектов. beg указывает на объект *item. А item В свою очередь указывает на на следущий айтем и на *object. Который и является IZD. ну и т.д.
Далее: вот код:

файл head.h

#include <iostream>
#include <string>
using namespace std;
#pragma once
class item;
class object
{
public:
item *beg; // указатель на список
virtual void show()=0;

};
class item
{
public:
item *next;
object *info;



// void del();
//item(){cout<<"\nконструктор\n";};
//~item(){cout<<"\nдеструктор\n";};
static void add(object*, object*);
//void show();
};


//--------------------
class IZD : public object
{

protected:
string NAME; //наименование
public:

IZD(string name="без название (IZD)"){NAME=name; beg=NULL;};
IZD(const IZD &); // конструктор копирования
virtual ~IZD(){};// деструктор
string getname(); //получение наименования
void setname(string); // инициализация наименования
void show();
};
//--------------------
class Mech : public object // механизм
{

protected:
string MechName; //наименования механизма

public:
Mech(string mechname="без названия (Mech)")
{
MechName=mechname;
beg=NULL;
}
void show();

};
//---------------------
class Node : public object // узел
{

protected:
string NodeName; //наименовани узла

public:
Node(string nodename="без названия (Node)")
{
beg=NULL;
NodeName=nodename;

};
void show();
};
//----------------------
class Detail : public object // деталь
{
protected:
string DetailName; //наименование детали
double weight; //вес детали
public:
Detail (string detailname="без название (Detail)", double we=0.0)
{
DetailName=detailname; weight=we; beg=NULL;
};
void show();
};
//----------------------
typedef double(*PF1)(object *ob);//задаем тип указателя на функцию

class WH : public object
{
protected:
string NameWH; //название склада
int size; // площадь склада
public:

WH (string namewh="без название (склад)", int s=0) // конструктор
{
NameWH=namewh; size=s; beg=NULL;
};
void show();
double for_each1(PF1 action1, string);



};






Файл Detail.cpp

#include "head.h"
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
void Detail::show()
{
//cout<<"*************"<<endl;
cout<<"название детали: "<<DetailName<<" tее вес:"<<weight<<endl;
cout<<"_____________"<<endl;

}

файл item.cpp

#include "head.h"
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;

void item::add(object * nach,object *dop)
{
if (nach->beg==NULL)
{
item *it;
it=new item;
nach->beg=it;
it->next=NULL;
it->info=dop;
}
else
{
item *it;
it=new item;
nach->beg->next=it;
it->next=NULL;
it->info=dop;

}


}


файл IZD.cpp

#include "head.h"
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;

IZD::IZD(const IZD &M) //конструктор копирования
{
NAME=M.NAME;
}
string IZD::getname() //селектор наименования
{
return NAME;
}
void IZD::setname(string s) //модификатор наименования
{
NAME=s;
}
void IZD::show()
{
//cout<<"**************************** **********"<<endl;
cout<<"Название изделия:"<<NAME<<endl;
cout<<"|||||||||||||||||||||||||||| |||||||||||||"<<endl;
item *temp;
if (this->beg==NULL){cout<<"в данном изделии нет механизмов"<<endl; return;};
temp=this->beg;
do
{
temp->info->show();
temp=temp->next;

}
while (temp);


}
Niksan вне форума Ответить с цитированием
Старый 27.03.2011, 20:36   #2
Niksan
Пользователь
 
Регистрация: 27.03.2011
Сообщений: 22
По умолчанию

файл Mech.cpp

#include "head.h"
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
void Mech::show()
{
//cout<<"**************************** *"<<endl;
cout<<"Название механизма:"<<MechName<<endl;
cout<<"**************************** ****"<<endl;
item *temp;
if (this->beg==NULL){cout<<"в данном механизме нет узлов"<<endl; return;};
temp=this->beg;
do
{
temp->info->show();
temp=temp->next;

}
while (temp);


}

файл Node.cpp

#include "head.h"
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
void Node::show()
{ //cout<<"********************"<<endl;
cout<<"Название узла:"<<NodeName<<endl;
cout<<"-----------------------"<<endl;
item *temp;
if (this->beg==NULL){cout<<"в данном узле нет деталей"<<endl; return;};
temp=this->beg;
do
{
temp->info->show();
temp=temp->next;

}
while (temp);

}

файл WH.cpp

#include "head.h"
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
void WH::show()
{

cout<<"Название склада:"<<NameWH<<endl;
cout<<"^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^"<<endl;
item *temp;
if (this->beg==NULL){cout<<"склад пустой"<<endl; return;};
temp=this->beg;
do
{
temp->info->show();
temp=temp->next;

}
while (temp);

};
double WH::for_each1(PF1 action1 ,string s) // итератор
{
//вообщем, суть в том, что мне нужно выводить
//сумаррный вес всех деталей в заданом узле, при чем с данного склада
//не получается у меня обратится к объекту, который на иерахию ниже
item *i=beg; //указатель на связанный список
//допустим хочу получить название какого нить механизма,
// к примеру вот такого:
string ss=i->info->beg->info->MechName;
//там где красненкое в выпадающем списке уже не выходит поле beg,
//а совсем другие методы.... как обратиться к названию механизма?



};


файл main.cpp

#include "head.h"
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
double ves (object *ob)
{



};
void main()
{
SetConsoleOutputCP(1251);
SetConsoleCP(1251);

IZD i1("Машина(i1)"); //создаем изделие
Mech m2("Рулевой механизм(m2)"), m1("Мотор (m1)"); // создаем механзмы
Detail d1("Болтик (d1)", 20.5),d2("Звено (d2)", 50.5), d3("Гайка(d3)", 45.8); //создаем детали
Node n1("Цепь(n1)"), n2 ("Сцепление(n2)"); //создаем детали
WH w1("склад № 666"); //создаем пустой склад

object *dy1=&d1, *dy2=&d2, *ny1=&n1, *my1=&m1, *dy3=&d3, *ny2=&n2, *iy1=&i1, *my2=&m2, *wy1=&w1; //создаем указатели на абстракный класс, и связываем их с соотвествующими объектами
item::add(ny1,dy1); //добовляем объекты в иерархию
item::add(ny1,dy2);
item::add(ny2,dy3);
item::add(my1,ny1);
item::add(my1,ny2);
item::add(my2,ny1);
item::add(iy1,my1);
item::add(iy1,my2);

item::add(wy1,iy1);// добовляем изделие в склад



wy1->show();


cout<<"\n";

}


вопрос в коментах определения класса WH
Niksan вне форума Ответить с цитированием
Старый 27.03.2011, 23:46   #3
Niksan
Пользователь
 
Регистрация: 27.03.2011
Сообщений: 22
По умолчанию

Страно, добавил в абстрактный класс object

string getname(); //получение наименования

в каждом соотвестующем классе определил функцию эту, и каким то чудесным образом теперь я могу писать конструкции типа:

objcet *p;
item *i=beg;
p=beg->info->beg->info;

странно это как то.....
Niksan вне форума Ответить с цитированием
Старый 28.03.2011, 01:21   #4
Niksan
Пользователь
 
Регистрация: 27.03.2011
Сообщений: 22
По умолчанию

Допишу код когда полностью, и выложу. МОжет у кого подобные вопросы просто возникнут....
Niksan вне форума Ответить с цитированием
Старый 28.03.2011, 23:41   #5
Niksan
Пользователь
 
Регистрация: 27.03.2011
Сообщений: 22
По умолчанию

head.h
Код:
#include <iostream>
#include <string>
using namespace std;
#pragma once 
class item;
class object
{
public:
	item *beg; // указатель на список
	virtual void show()=0;
	virtual string getname()=0;
	virtual ~object();

};
class item
{
public:
	item *next;
	object *info;
	static void add(object*, object*);
};
//--------------------
class IZD : public object
{
protected:
	string NAME; //наименование
public:
	IZD(string name="без название (IZD)"){NAME=name; beg=NULL;};
	IZD(const IZD &); // конструктор копирования
	virtual ~IZD(){};// деструктор
	string getname(); //получение наименования
	void setname(string); // инициализация наименования
	void show();
};
//--------------------
class Mech : public object // механизм
{	
protected:
	string MechName; //наименования механизма	
public:
	Mech(string mechname="без названия (Mech)")
	{
		MechName=mechname;	
		beg=NULL;
	}
	void show();
	string getname(){return MechName;};
	item * getbeg(){return beg;};	
};
//---------------------
class Node : public object // узел
{	
protected:
	string NodeName; //наименовани узла	
public:		
	Node(string nodename="без названия (Node)")
	{
		beg=NULL;
		NodeName=nodename;				
	};
	void show();
	string getname(){return NodeName;};
	item * getbeg(){return beg;};
};
//----------------------
class Detail : public object // деталь
{
protected:
	string DetailName; //наименование детали
	double weight; //вес детали
public:	
	Detail (string detailname="без название (Detail)", double we=0.0)
	{
		DetailName=detailname;	weight=we; beg=NULL;
	};
	void show();
	string getname(){return DetailName;};
	double getweight(){return weight;};
};
//----------------------

typedef double(*PF1)(object *,string,int*);//задаем тип указателя на функцию
typedef void (*PF2)(object *,string, int*); 

class WH : public object
{
protected:
	string NameWH; //название склада
	int size;  // площадь склада
public:
	WH (string namewh="без название (склад)", int s=0) // конструктор
	{
		NameWH=namewh; size=s; beg=NULL; 
	};
	void show();
	double for_each1(PF1 action1, string);
	string getname(){return NameWH;};
	void for_each2(PF2 action2, string);
};

//Суммарный вес всех деталей в заданном узле.
//Наименование всех деталей (узлов), входящих в заданный узел (ме-ханизм).
Код:
//Deatil.cpp

#include "head1.h"
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
void Detail::show()
{
	cout<<"название детали: "<<DetailName<<"   tее вес:"<<weight<<endl;
	cout<<"_____________"<<endl;	
}

//item.cpp

#include "head1.h"
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
void item::add(object * nach,object *dop)
{
	if (nach->beg==NULL) //если в объекте нет ниодного добавленного объекта
	{
		item *it;
		it=new item;
		nach->beg=it;
		it->next=NULL;
		it->info=dop;
	}
	else //если в объекте уже есть какой-то добавленный объект
	{	
		item *it;
		it=new item;
		nach->beg->next=it;
		it->next=NULL;
		it->info=dop;		
	}	
};


//IZD.cpp

#include "head1.h"
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;

IZD::IZD(const IZD &M)   //конструктор копирования
{
	NAME=M.NAME;
}
string IZD::getname() //селектор наименования
{
	return NAME;
}
void IZD::setname(string s) //модификатор наименования
{
	NAME=s;
}
void IZD::show()
{	
	cout<<"Название  изделия:"<<NAME<<endl;
	cout<<"|||||||||||||||||||||||||||||||||||||||||"<<endl;
	item *temp;
	if (this->beg==NULL){cout<<"в данном изделии нет механизмов"<<endl; return;};
	temp=this->beg; //проходим по списку, пока не кончится он
	do
	{
		temp->info->show();
		temp=temp->next;

	}
	while (temp);	
}

 
//Mech.cpp

#include "head1.h"
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
void Mech::show()
{
	//cout<<"*****************************"<<endl;
	cout<<"Название механизма:"<<MechName<<endl;
	cout<<"********************************"<<endl;
	item *temp;
	if (this->beg==NULL){cout<<"в данном механизме нет узлов"<<endl; return;};
	temp=this->beg;
	do
	{
		temp->info->show();
		temp=temp->next;

	}
	while (temp);
	
	
}


//Node.cpp

#include "head1.h"
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
void Node::show()
{	//cout<<"********************"<<endl;
	cout<<"Название узла:"<<NodeName<<endl;
	cout<<"-----------------------"<<endl;
	item *temp;
	if (this->beg==NULL){cout<<"в данном узле нет деталей"<<endl; return;};
	temp=this->beg;
	do
	{
		temp->info->show();
		temp=temp->next;

	}
	while (temp);
	
}

Последний раз редактировалось Niksan; 28.03.2011 в 23:47.
Niksan вне форума Ответить с цитированием
Старый 28.03.2011, 23:43   #6
Niksan
Пользователь
 
Регистрация: 27.03.2011
Сообщений: 22
По умолчанию

Код:
//object.cpp


#include "head1.h"
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
object::~object()
{
	item *nach=beg;
	item *temp=nach;
	while(nach)
	{
		temp=nach;
		nach=nach->next;
		delete temp;
	}
}

//WH.cpp

#include "head1.h"
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
void WH::show()
{	
	cout<<"Название склада:"<<NameWH<<endl;
	cout<<"^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"<<endl;
	item *temp;
	if (this->beg==NULL){cout<<"склад пустой"<<endl; return;};
	temp=this->beg;
	do
	{
		temp->info->show();
		temp=temp->next;

	}
	while (temp);
};
double WH::for_each1(PF1 action1 ,string s) // итератор
{
	double sum=0;
	int *flag=new int;
	*flag=0;
	item *PointFromWH=beg;
	while(PointFromWH)
	{
		item *PointFromIZD=PointFromWH->info->beg;
		while(PointFromIZD)
		{
			item *PointFromMech=PointFromIZD->info->beg;
			while(PointFromMech)
			{
				item *PointFromNode=PointFromMech->info->beg;
				while(PointFromNode)
				{
					sum=sum+(*action1)(PointFromNode->info,s,flag);
					PointFromNode=PointFromNode->next;
				}
				sum=sum+(*action1)(PointFromMech->info,s,flag);
				PointFromMech=PointFromMech->next;
			}
			sum=sum+(*action1)(PointFromIZD->info,s,flag);
			PointFromIZD=PointFromIZD->next;
		}
		sum=sum+(*action1)(PointFromWH->info,s,flag);
		PointFromWH=PointFromWH->next;
	}	
	if(*flag==0) cout<<"Узла "<<s<<" нет на складе";
	delete flag;
	return sum;

};

void WH::for_each2(PF2 action2 ,string s) // итератор
{
	int *flag=new int;
	*flag=0;
	
	item *PointFromWH=beg;
	
	while(PointFromWH)
	{
		item *PointFromIZD=PointFromWH->info->beg;
		while(PointFromIZD)
		{
			item *PointFromMech=PointFromIZD->info->beg;
			while(PointFromMech)
			{
				item *PointFromNode=PointFromMech->info->beg;
				while(PointFromNode)
				{
					(*action2)(PointFromNode->info,s,flag);
					PointFromNode=PointFromNode->next;
				}
				(*action2)(PointFromMech->info,s,flag);
				PointFromMech=PointFromMech->next;
			}
			(*action2)(PointFromIZD->info,s,flag);
			PointFromIZD=PointFromIZD->next;
		}
		(*action2)(PointFromWH->info,s,flag);
		PointFromWH=PointFromWH->next;
	}	

	if (*flag==0) cout<<"на даном складе нет заданого механизма(узла)"<<endl;
	delete flag;
	return;
	

};

Последний раз редактировалось Niksan; 28.03.2011 в 23:48.
Niksan вне форума Ответить с цитированием
Старый 28.03.2011, 23:44   #7
Niksan
Пользователь
 
Регистрация: 27.03.2011
Сообщений: 22
По умолчанию

main.cpp

Код:
#include "head1.h"
#include <windows.h>
#include <iostream>
#include <string>
#include <typeinfo.h>
using namespace std;
double ves (object *ob,string s,int *flag) //функция определяющая тот ли это узел, и если тот, то вычесляет суммарный вес всех деталей в нее входящий
{	
	if(*flag==1) return 0.0;
	string st=ob->getname();
	double temp=0;
	if (typeid(*ob)==(typeid(Node))) 
	{
		Node *d=dynamic_cast<Node*>(ob); //Безопасное приведение типа
		if ((d->getname())==s)
		{
			*flag=1;
			item *it=d->getbeg();
			while(it)
			{
				Detail *det=dynamic_cast<Detail*>(it->info);							
				temp=temp+det->getweight();
				it=it->next;
			}			
			return temp;
		}
	}
	return 0.0;
};
void allname(object *ob, string s, int *flag)
{
	if (*flag==1) return;
	string st=ob->getname();	 
	if (typeid(*ob)==(typeid(Node)))
	{
		Node *d=dynamic_cast<Node*>(ob);//Безопасное приведение типа
		if ((d->getname())==s) //если название узла совпадает с веденным
		{
			
			*flag=1;
			cout<<"в узел "<<s<<" входят детали:\n";
			item *it=d->getbeg();
			while(it)
			{
				Detail *det=dynamic_cast<Detail*>(it->info);							
				cout<<det->getname()<<endl;
				it=it->next;
			}			
			return;
		}
	}
	if (typeid(*ob)==(typeid(Mech)))
	{
		Mech *m=dynamic_cast<Mech*>(ob);
		if ((m->getname())==s)
		{
			*flag=1;
			cout<<"в механизм "<<s<<" входят узлы:\n";
			item *it=m->getbeg();
			while(it)
			{
				Node *nod=dynamic_cast<Node*>(it->info);							
				cout<<nod->getname()<<endl;
				it=it->next;
			}			
			return;
		}
	}
}

void main()
{
	SetConsoleOutputCP(1251);
	SetConsoleCP(1251);

	IZD i1("Машина"); //создаем изделие
	Mech m2("Рулевой_механизм"), m1("Мотор"); // создаем механзмы
	Node n1("Цепь"), n2 ("Сцепление"), n3("Крепление"); //создаем узлы
	Detail d1("Болтик", 20.5),d2("Звено", 50.5), d3("Гайка", 45.8), d4("Скоба", 33.3); //создаем детали
	
	WH w1("склад № 666",500); //создаем пустой склад

	object *dy1=&d1, *dy2=&d2, *ny1=&n1, *my1=&m1, *dy3=&d3, *ny2=&n2, *iy1=&i1, *my2=&m2, *wy1=&w1, *dy4=&d4, *ny3=&n3; //создаем указатели на абстракный класс, и связываем их с соотвествующими объектами
	item::add(ny1,dy1); //добовляем Детали в узлы
	item::add(ny1,dy2);
	item::add(ny2,dy3);
	item::add(ny3,dy4);

	item::add(my1,ny1); // добовляем узлы в механизмы
	item::add(my1,ny2);
	item::add(my2,ny3);

	item::add(iy1,my1); //добовляем механизмы в изделие
	item::add(iy1,my2);

	item::add(wy1,iy1);
	item::add(wy1,iy1);// добовляем изделие в склад	

	wy1->show();//показываем склад


	cout<<"\n"<<"Введите название узла, что бы узнать суммарный вес всех деталей в нем"<<endl;
	string node;
	cin>>node;
	
	if (w1.for_each1(ves,node)!=0.0)
		cout<<"\n"<<w1.for_each1(ves,node)<<endl;// вызываем итератор

	cout<<"\n"<<"Введите название узла(механизма), что бы узнать какие детали(узлы) входят в него";
	string ololo;
	cin>>ololo;
	cout<<"\n";
	w1.for_each2(allname,ololo);// вызываем итератор

}
Niksan вне форума Ответить с цитированием
Старый 28.03.2011, 23:49   #8
Niksan
Пользователь
 
Регистрация: 27.03.2011
Сообщений: 22
По умолчанию

Русский форум: Сам спросил - сам ответил XD))
Niksan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Иерархия данных VBA leonard Microsoft Office Excel 12 10.12.2010 12:43
Иерархия классов lirikoff Помощь студентам 7 21.10.2010 23:51
иерархия классов ООП Astro4ka Помощь студентам 3 29.06.2010 23:34
Иерархия из CheckBox'ов minarett JavaScript, Ajax 1 22.02.2010 13:42
Иерархия skyline_skyline Microsoft Office Excel 3 04.09.2009 13:00