IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> C++, STL проект
сообщение
Сообщение #1


Ночной волк
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской

Репутация: -  1  +


Проект по STL "Компьютерный магазин".

Программа должна обрабатывать базу данных компьютеров и комплектующих. Сортировать, выводить по параметрам, ввод,вывод... Объекты класса компьютер содержат ссылки на соответстувующее железо. Удаляешь компьютер - авто удаляется и его железо. Помогите правильно организовать классы, я немного запутался на этом этапе.

Проблема в том как вообще все это организовать и в классах ввода вывода - они должны наследовать от стандартных и самостоятельно понимать ссылка на железо или на компьютер передана.

Примерная схема задумки в приложении.


//Preprocessor//
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <conio.h>
#include <windows.h>
#include <process.h>

using namespace std;

////INTERFACE///////
//Menu

int menu(){
cls();
cout << "PUT Some key" << endl;
cout << "F1 - vvod F2 - vivod vse" << endl;
int key;
while(1){
key = getch();
switch (key){
case 59: AddHard(); break;
case 60: PrintAllHard(); break;
}
}
}


//////////////////
////OBJECTS///////
//////////////////

class apparate{
private:
string name;
float price;
float termo;
public:
virtual float optim()=0;
inline void set_name(string n){
this->name=n;
}

inline void set_price(float pr){
this->price=pr;
}
inline void set_termo(float tr){
this->termo=tr;
}
};

class hardware: public apparate{
private:
string type;
string descript;
float memory;
float freq;
public:
hardware(){
this->freq=9;
};

hardware( string t, string d, float m, float f){
this->type=t;
this->descript=d;
this->memory=m;
this->freq=f;
}


virtual float optim(){
return 0;
}
inline set_type(string t){
this->type=t;
}
inline set_desc(string d){
this->descript=d;
}
inline set_mem(float m){
this->memory=m;
}
inline set_freq(float f){
this->freq=f;
}
};

class computer: public hardware{
private:
hardware opermem;
hardware soundcard;
public:

};


///////////////////////
/////RULE CLASSES//////
///////////////////////

class ioconsole{
private:

public:
void cls(){
HANDLE hConsole;
CONSOLE_SCREEN_BUFFER_INFO csInfo;
DWORD dummy;
COORD Home={0,0};
hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hConsole, &csInfo);
FillConsoleOutputCharacter(hConsole,' ',csInfo.dwSize.X*csInfo.dwSize.Y,Home,&dummy);
SetConsoleCursorPosition(hConsole,Home);
printf("\nComputer Magazine\n");
printf(" \n");
}

void PrintAllHard(hardware &h){
for (int i=1; i<h.size; i++){
h[i].print();
cout << endl;
}
}

void Print(){
cout << type << " - " << descript <<" - " << memory << " - " << freq << endl;
}

void AddHard(hardware &h){

hardware temp;
string temp1;
float temp2;
cin >> temp1;
temp.set_name(temp1);
cin >> temp1;
temp.set_desc(temp1);
cin >> temp2;
temp.set_mem(temp2);
cin >> temp2;
temp.set_freq(temp2);
h.push_back(temp);
}
}

class iofile : public iofstream{

}



///////////////
/////MAIN//////
///////////////

int main(){
hardware temp("vint", "40 gb IDE RAID", 40, 34.4f);
vector<hardware> hSpisok;
vector<hardware>::iterator hIterator;

cout << hSpisok.size()<<endl;


return 0;
};



Эскизы прикрепленных изображений
Прикрепленное изображение

--------------------
Не думай о белой обезьяне.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
Удаляешь компьютер - авто удаляется и его железо.
Стоп. А вот с этого места - поподробнее... А может одинаковое железо использоваться в разных компьютерах, и что тогда делать при удалении компьютера? Удалять только когда никто больше не использует? Это был первый вопрос.

Второй - вот это:
class computer: public hardware{
private:
hardware opermem;
hardware soundcard;
public:
};

делать не надо. У тебя получается адская смесь: и наследование, и агрегация одновременно, так нельзя, надо будет переделывать. Скорее всего. наследование здесь не надо (по крайней мере - не в таком виде), потому что компьютер содержит "память" и "звуковую карту", а значит, должен содержать в себе их классы...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Ночной волк
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской

Репутация: -  1  +


1. Железа имеется определенное количество, например 5 винтов; если компьютер купили - из каждой коробки вычитается по одной. Я вот подумал когда все заканчивается - не удалять полностью, а только присваивать 0, ведь могут и новую партию завезти.

2. Дело в том, что трехуровневое наследование - обязательное условие проекта. Его нужно оставить, хотя и не обязательно в таком виде. Если придумать что-то другое содержащее данное наследование - то отсюда его можно убрать.

Просто я хочу разнообразить программу добавив возможность собирать компьютер из доступного железа.

Смесь тут идея была такая - на основе содержащихся в hardware opermem; hardware soundcard; данных заполнять собственные параметры компьютера, т.е. из оперативной памяти берем memory из процессора freq. А при необходимости получать доступ ко всем комплектующим, например вывести их все.



--------------------
Не думай о белой обезьяне.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Ну, для начала, давай определимся со структурой классов:
#include <iostream>
#include <vector>

using namespace std;

class Base {
public:
Base()
{
}
};

class Hardware: public Base {
public:
Hardware(): Base()
{
}
};
class HDD: public Hardware {
public:
HDD(): Hardware()
{
}
};
class Memory: public Hardware {
public:
Memory(): Hardware()
{
}
};
// любые другие составляющие - наследники Hardware

class Computer {
public:
Computer()
{
}

private:
vector<Hardware*> items; // список указателей на составляющие
};

int main()
{
return 0;
}
тебя устроит? В принципе, здесь наследование Hardware от Base притянуто за уши, но может быть полезно, скажем, если тебе понадобится работать не только с аппаратным, но и с программным обеспечением, тогда унаследуешь от Base еще и класс Software, а от него уже - разные виды программ, так что это имеет право на существование...

Дальше - надо будет перегрузить операции >> и << для классов, которые будут работать с istream/ostream, а следовательно и с файлами (автоматически), ну, и добавить собственно, нужные характеристики в каждый класс, и меню...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Ночной волк
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской

Репутация: -  1  +


Вот структура которая у меня получилась. Так будет работать?
Как правильно сделать класс ioconsole чтобы полиморфно принимал оба типа?


Прикрепленные файлы
Прикрепленный файл  Kursov.cpp ( 3.44 килобайт ) Кол-во скачиваний: 148


--------------------
Не думай о белой обезьяне.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






1) зачем в классе Hardware хранится memory? freq? Ты решил хранить конкретные данные в этом классе, что-ли? Тогда зачем тебе вся эта канитель с векторами составляющих? В том-то и суть, что Hardware - это абстрактный класс "какой-то там аппаратуры", нет у него никаких конкретных характеристик, какая частота может быть у жесткого диска, например? Все характеристики хранятся в конкретных типах. Частота и емкость - в Memory, емкость и скорость - в HDD, частота и количество ядер - в Processor... Что есть общего (присутствует у всех элементов аппаратного обеспечения) - это только цена и название (что такое termo - я не знаю).
2) ты опять за свое? Зачем тебе класс ioconsole, если потоки ввода вывода без тебя работают со стандартной консолью? Тебе достаточно описать глобальную функцию cls() для очистки консоли, это все, что надо (что надо сделать еще - я уже написал выше, повторять не буду)...
3) почему AddHard является методом ioconsole? Это что, функциональность консоли, добавлять в список аппаратных составляющих новый элемент? Нет, это функциональность Menu, не надо перекладывать это на консоль.

В общем, я не буду больше отвечать, пока ты не научишься аргументированно сообщать, чем тебе не нравится то, что я привел выше. Вот почему я тебе все время пишу: 1) ... 2) ... 3) ..., а ты ни слова не говоря, опять приводишь что-то свое, и спрашиваешь, будет ли оно работать? А МНЕ-то зачем это надо, опять лазить по твоей программе, искать, чем это плохо, чем - хорошо, говорить что-то... Зачем? Чтобы опять, безо всяких причин и без объяснений ты привел свою реализацию и начал спрашивать, будет ли оно работать? Так зачем задаешь вопросы? Сделай и посмотри, будет, или нет... А потом я сделаю свой вариант, и сравним...

P.S. У тебя уже не структура, а РЕАЛИЗАЦИЯ. Структура - это только классы, без конкретики... Меня не интересует на данном этапе, как именно ты очищаешь экран. Если тебе для этого надо 10 строк кода - то это только твои проблемы. Вообще это делается в 2 строки. Пока тебе надо только связать все в одно целое...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Ночной волк
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской

Репутация: -  1  +


Вопрос: как хранить всех потомков Hardware в одном векторе?


#include <iostream>
#include <vector>
#include <conio.h>
#include <string>


using namespace std;


//Ñòðóêòóðà îñíîâíûõ êëàññîâ//

//1//

class Base {
public:
string name;

void set_name(string n){
this->name=n;

}
string get_name(){
return this->name;
}

};

//2//

class Hardware: public Base {
public:
string desc;
void set_desc(string n){
this->desc=n;

}
string get_desc(){
return this->desc;
}


};

//3//

class HDD: public Hardware {
public:
float memory;
float RPM;

void set_memory(float n){
this->memory=n;

}
float get_memory(){
return this->memory;
}

void set_RPM(float n){
this->RPM=n;

}
float get_RPM(){
return this->RPM;
}

};
class Memory: public Hardware {
public:
float memory;
float CAS;


};

// 4 //

class Computer {
public:
Computer()
{
}

private:
vector<Hardware*> items; // ñïèñîê óêàçàòåëåé íà ñîñòàâëÿþùèå
};


//////////////////////
//////////////////////

//Óïðàâëÿþùèå êëàññû//

class Menu{

public:

void Start(){

vector<Hardware> hSpisok;
HDD p;
p.set_memory(20);
p.set_name("Hello");
cout<< p.get_memory();
hSpisok.push_back(p);
cout << hSpisok[1].get_name();



//LOOP//
cout << "PUT Some key" << endl;
cout << "F1 - vvod hardware F2 - vivod vse F10 - EXIT" << endl;
int key;
while(1){
key = getch();
switch (key){
case 59: ; break;
case 60: ; break;
case 68: ; exit(0);
}

}
}


};

int main(){
Menu MyMenu;
MyMenu.Start();


return 0;
}



1. Должно же хоть что-то наследоваться от Hardware, иначе какой в нем смысл

2. Это специфика задания. Нужно создать собственные классы работающие с файлами и консолью.

3. Да, пожалуй

4. Как очистить экран?

Сообщение отредактировано: ammaximus -


--------------------
Не думай о белой обезьяне.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Я извиняюсь, что вмешиваюсь.. Очень понравилось:
Цитата(ammaximus @ 22.06.2009 6:55) *
1. Должно же хоть что-то наследоваться от Hardware, иначе какой в нем смысл
Напомнило Козьму Пруткова (вольный пересказ):
"Стоя на мосту и плюя в воду, следи за расходящимися кругами - иначе твое занятие будет бессмысленным."

ammaximus, не подменяй поиск смысла еще большей бессмыслицей.. Тебе сказали: цена наследуется. Мало? smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






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

class Base {
friend ostream& operator << (ostream&, Base&);
protected:
virtual void Print(ostream&) = 0; // Переопределяется в каждом наследнике
public:
Base()
{
}
};

ostream& operator << (ostream& os, Base& b)
{
b.Print(os);
return os;
}
будет работать и с файлом и с консолью. Причем будет работать лучше твоего класса, потому что мой вариант 1) кроссплатформенный, 2) работает на любом компиляторе, а в твоем будут проблемы не под Windows, и могут быть проблемы, если компилировать под Windows, но другим компилятором (кстати, с чем ты работаешь, ты тоже не сказал... У меня GCC + Debian, под Windows теперь не знаю, когда буду, так что WinAPI временно пролетает), ибо с API каждый компилятор почему-то работает по своему, а Стандарт есть Стандарт...

Цитата
Должно же хоть что-то наследоваться от Hardware
Я тебе сказал, что смысла нет, сразу (просто уточнил, для чего это может оказаться полезным). Но ты же получил задание сделать три уровня наследования? Какой в этом смысл? Ну, кроме этого, цена и название могут там храниться...
Цитата
Как очистить экран?
Вывести 25 переводов строки в поток std::cout

Цитата
как хранить всех потомков Hardware в одном векторе?
Я тебе написал уже, храни не самих потомков, а указатели на них...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Ночной волк
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской

Репутация: -  1  +


Я не знаю как хранить потомков в базовом векторе, они преобразуются в базовый и доступ теряется, что делать?

vector<Hardware*> hSpisok;
HDD *p = new HDD;
(*p).set_name("Hello");
(*p).set_memory(30);

cout << (*p).get_name() << (*p).get_memory();

hSpisok.push_back(p);
cout << (*hSpisok[0]).get_name() << (*hSpisok[0]).get_memory(); // ошибка, не является членом///


cout << (*p).get_name();

(у hdd появляется memory)


--------------------
Не думай о белой обезьяне.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.10.2020 11:37
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name