есть программа(Main) в Borland Builder 6, нужно создать новый unit(Types) в котором будут описания class-ов для программы.
примерно такие:
class address{
string street; // название улицыunsigned char house; // номер дома
.....
};
class firm{
unsigned int id; // идетнификатор компании
string name; // название компании
address addr[]; // массив с адресами
};
Нужно чтобы для каждой компании(firm) были разной длины массивы addr. (у компании может быть 1 адрес, может быть и 10 адресов)
#include <vector>
А>class firm{
А> unsigned int id; // идетнификатор компании
А> string name; // название компании
А> std::vector<address> addr; // массив с адресами
А>};
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Аноним, Вы писали:
WH>
WH>#include <vector>
А>>class firm{
А>> unsigned int id; // идетнификатор компании
А>> string name; // название компании
А>> std::vector<address> addr; // массив с адресами
А>>};
WH>
Это подлый ответ У человека, наверняка, лабораторная работа, и stl они там и в глаза не видели... А теперь будут думать — что это за vector и что с ним делать... :\ ...
Здравствуйте, Аноним, Вы писали:
А>Нужно чтобы для каждой компании(firm) были разной длины массивы addr. (у компании может быть 1 адрес, может быть и 10 адресов)
Так в чем именно проблема??? Ты ж вроде классы как набросал?
Re: HELP создание класса
От:
Аноним
Дата:
25.12.03 16:16
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Нужно чтобы для каждой компании(firm) были разной длины массивы addr. (у компании может быть 1 адрес, может быть и 10 адресов)
А не проще СУБД прикрутить... + ADO + Client к примеру...
WH>>#include <vector>
А>>>class firm{
А>>> unsigned int id; // идетнификатор компании
А>>> string name; // название компании
А>>> std::vector<address> addr; // массив с адресами
А>>>};
WH>>
S> Это подлый ответ У человека, наверняка, лабораторная работа, и stl они там и в глаза не видели... А теперь будут думать — что это за vector и что с ним делать... :\ ...
Здравствуйте, <Аноним>, Вы писали:
А>А не проще СУБД прикрутить... + ADO + Client к примеру...
Если уж говорить о СУБД, то можно ее структуру и на С++ соорудить.
Причем из соображений 3НФ, должны быть таблицы
* АДРЕС (ид-адреса, улица, дом, корпус, офис)
* ФИРМА (ид-фирмы, название, ид-юридического-адреса, банковские-реквизиты и прочее)
* АДРЕСА_ФИРМЫ(ид-фирмы, ид-адреса)
АДРЕС и ФИРМА задают essense, а АДРЕСА_ФИРМЫ — relation (1->n).
Интересно, что если по одному адресу может быть только одна фирма, то ид-адреса будет ключом в таблице АДРЕСА_ФИРМЫ.
Как это сделать на С++?
В качестве ид-*** можно использовать адрес объекта. Остальные поля — это члены объекта.
Если идентификация идет по указателю (это очень удобно для доступа), то нужно позаботиться о том, чтобы объекты не перемещались при модификации базы. То есть хранить их в контейнерах типа std::set, std::list, std::map, или же использовать коллекции указателей (желательно умных), например std::set< boost::shared_ptr<Address>, less_shared_ptr >.
Поскольку могут встречаться разнообразные запросы, например, фирма по имени, фирма по адресу и т.п., то, помимо основных коллекций, нужно завести еще индексы. std::map< std::string, boost::shared_ptr<Firm> >...
Наконец, чтобы поддерживать целостность системы, нужно инкапсулировать базу, чтобы действия над ней проходили слаженно. Например, добавляя очередную запись, тут же регистрировать ее в индексах.
При этом получится "многослойная" архитектура программы:
1. реализация таблиц БД (отдельные контейнеры)
2. уровень, обеспечивающий целостность (1): примитивные действия с данными
3. реализация типовых запросов к БД
4. бизнес-логика, которая выполняет эти типовые запросы, когда ей это нужно.
... << RSDN@Home 1.1.0 stable >>
Перекуём баги на фичи!
Re[4]: HELP создание класса
От:
Аноним
Дата:
26.12.03 06:23
Оценка:
Спасибо за ответы.
С ObjectPascal перехожу на C++.
Вот поэтому такие вопросы задаю (в институте отучился уже)
У меня еще один вопрос возник:
есть программа и модуль(types.cpp, types.h)
В модуле я описываю типы и функции
Когда пробую вызывать функции из программы, она ругается и говорт нет такой функции в main.obj
код примерно такой:
//---------types.h-----#ifndef typesH
#define typesH
#include <system.hpp>;
#include <cstring.h>;
#include <vector>;
class ADR{
public:
unsigned short int house;
string office;
string ext;
string full;
};
class FIRM{
public:
unsigned int fid;
string org_name;
string firm_name;
std::vector<ADR> ADR;
void get_all_firm();
};
#endif
Программа и так с базой данных работает, но для того чтоб информацию обрабатывать в программе я и создаю эти классы(firm, address)
Принцип такой
1. Соединяемся с базой, получаем данные
2. Для удобного обращения с данными толкаем в объекты типа firm, address
3. делаем чего нам нужно
Re[2]: HELP создание класса
От:
Аноним
Дата:
26.12.03 06:32
Оценка:
А>А не проще СУБД прикрутить... + ADO + Client к примеру...
База mysql, обращаюсь напрямую так как быстрее и модуль этот еще и в линухе работать должен
WH>>#include <vector>
А>>>class firm{
А>>> unsigned int id; // идетнификатор компанииА>>> string name; // название компанииА>>> std::vector<address> addr; // массив с адресами
А>>>};
WH>>
S> Это подлый ответ У человека, наверняка, лабораторная работа, и stl они там и в глаза не видели... А теперь будут думать — что это за vector и что с ним делать... :\ ...
Уверен? Тогда подумай что это за string выделеный...
... << RSDN@Home 1.1 beta 2 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
[]
> Как это сделать на С++? > > В качестве ид-*** можно использовать адрес объекта. Остальные поля — это > члены объекта. > Если идентификация идет по указателю (это очень удобно для доступа), то > нужно позаботиться о том, чтобы объекты не перемещались при модификации > базы. То есть хранить их в контейнерах типа std::set, std::list, > std::map, или же использовать коллекции указателей (желательно умных), > например std::set< boost::shared_ptr<Address>, less_shared_ptr >.
Будет совсем непросто создать объекты по тем же самым адресам при
следующем запуске.
А вот с использованим UUID в качестве id проблем не должно возникнуть.
Здравствуйте, MaximE, Вы писали:
ME>Будет совсем непросто создать объекты по тем же самым адресам при ME>следующем запуске.
А нужно поддерживать целостность. Объект йок — и соответствующие элементы мапа тоже йок.
Можно вместо UUID использовать последовательную нумерацию (каждому объекту присваивать новый номер из глобального счетчика).
Разрядность — не меньше 64бит.
Кодт wrote:
> Можно вместо UUID использовать последовательную нумерацию (каждому объекту присваивать новый номер из глобального счетчика). > Разрядность — не меньше 64бит.
Со счетчиком с репликацией и объединением баз намучаешься.
Здравствуйте, MaximE, Вы писали:
M> Будет совсем непросто создать объекты по тем же самым адресам при M> следующем запуске.
А это и не обязательно: достаточно обеспечить механизм загрузки, учитывающий
старые указатели при создании новых объектов. Не нужно создавать объекты
по старым адресам, нужно обеспечить эквивалентность графа ассоциаций. Сделать
это можно сравнительно прозрачно для пользователя.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен