HELP создание класса
От: Аноним  
Дата: 25.12.03 12:58
Оценка:
Проблема в следующем:

есть программа(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 адресов)
Re: HELP создание класса
От: WolfHound  
Дата: 25.12.03 13:21
Оценка:
Здравствуйте, Аноним, Вы писали:

#include <vector>
А>class firm{
А>  unsigned int   id;     // идетнификатор компании
А>  string         name;   // название компании
А>  std::vector<address> addr; // массив с адресами
А>};
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: HELP создание класса
От: Shroo  
Дата: 25.12.03 16:09
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Аноним, Вы писали:


WH>
WH>#include <vector>
А>>class firm{
А>>  unsigned int   id;     // идетнификатор компании
А>>  string         name;   // название компании
А>>  std::vector<address> addr; // массив с адресами
А>>};
WH>


Это подлый ответ У человека, наверняка, лабораторная работа, и stl они там и в глаза не видели... А теперь будут думать — что это за vector и что с ним делать... :\ ...
Re: HELP создание класса
От: Shroo  
Дата: 25.12.03 16:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Нужно чтобы для каждой компании(firm) были разной длины массивы addr. (у компании может быть 1 адрес, может быть и 10 адресов)


Так в чем именно проблема??? Ты ж вроде классы как набросал?
Re: HELP создание класса
От: Аноним  
Дата: 25.12.03 16:16
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Нужно чтобы для каждой компании(firm) были разной длины массивы addr. (у компании может быть 1 адрес, может быть и 10 адресов)


А не проще СУБД прикрутить... + ADO + Client к примеру...
Re[3]: HELP создание класса
От: Кодт Россия  
Дата: 25.12.03 22:38
Оценка:
Здравствуйте, Shroo, Вы писали:

WH>>
WH>>#include <vector>
А>>>class firm{
А>>>  unsigned int   id;     // идетнификатор компании
А>>>  string         name;   // название компании
А>>>  std::vector<address> addr; // массив с адресами
А>>>};
WH>>

S> Это подлый ответ У человека, наверняка, лабораторная работа, и stl они там и в глаза не видели... А теперь будут думать — что это за vector и что с ним делать... :\ ...

Как это не видели? А string откуда взялся?
... << RSDN@Home 1.1.0 stable >>
Перекуём баги на фичи!
Re[2]: HELP создание класса
От: Кодт Россия  
Дата: 25.12.03 22:38
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>А не проще СУБД прикрутить... + 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




//---------types.cpp-----
#pragma hdrstop
#include "types.h"
#pragma package(smart_init)

FIRM *FIRM;

void FIRM::get_all_firm()
{
........
};





//---------main.h-----
#ifndef MainH
#define MainH
#include <windows.h>
#include "mysql/mysql.h"
#include "types.h"        <- мой модуль 
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>

class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TButton *Button1;
        void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
public:        // User declarations
        MYSQL *mysql;
        FIRM firm;
        __fastcall TForm1(TComponent* Owner);
};
extern PACKAGE TForm1 *Form1;
#endif




//---------main.cpp-----
#include <vcl.h>
#include <vector>
#pragma hdrstop

#include "Main.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  firm.fid= 1;                      <- работает 
  firm.ADR.insert(firm.ADR.begin()); <-работает
  firm.ADR.insert(firm.ADR.begin());
  firm.get_all();                    <- НЕ РАБОТАЕТ (говорит "[Linker Error] Unresolved external 'FIRM::get_all()' referenced from C:\PROJECTS WEB\C++\TEST\MAIN.OBJ") 
}


Подскажите чего делать надо...
Re[3]: HELP создание класса
От: Аноним  
Дата: 26.12.03 06:28
Оценка:
Программа и так с базой данных работает, но для того чтоб информацию обрабатывать в программе я и создаю эти классы(firm, address)

Принцип такой
1. Соединяемся с базой, получаем данные
2. Для удобного обращения с данными толкаем в объекты типа firm, address
3. делаем чего нам нужно
Re[2]: HELP создание класса
От: Аноним  
Дата: 26.12.03 06:32
Оценка:
А>А не проще СУБД прикрутить... + ADO + Client к примеру...

База mysql, обращаюсь напрямую так как быстрее и модуль этот еще и в линухе работать должен
Re[5]: HELP создание класса
От: SergeantAlexx  
Дата: 26.12.03 08:16
Оценка:
Здравствуйте, Аноним, Вы писали:

У тебя в Firm объявлена ф-я
Firm::get_all_firm();
а вызываешь ты
Firm::get_all();
Re[6]: HELP создание класса
От: Chost  
Дата: 26.12.03 08:22
Оценка:
Здравствуйте, SergeantAlexx, Вы писали:

SA>Здравствуйте, Аноним, Вы писали:


SA>У тебя в Firm объявлена ф-я

SA> Firm::get_all_firm();
SA>а вызываешь ты
SA> Firm::get_all();

сорри ошибся в примере — функции и в main и в types одинаковые
да и компилятор ругался бы не на main.obj а на то что в types.cpp необъявленая функция
Re[7]: HELP создание класса
От: WolfHound  
Дата: 26.12.03 11:12
Оценка:
Здравствуйте, Chost, Вы писали:

Дай угадаю... Ты types.cpp к проекту не подключил...
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: HELP создание класса
От: WolfHound  
Дата: 26.12.03 16:27
Оценка:
Здравствуйте, Shroo, Вы писали:

WH>>
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) А. Эйнштейн
Re[3]: HELP создание класса
От: MaximE Великобритания  
Дата: 29.12.03 00:42
Оценка:
Кодт wrote:

[]

> Как это сделать на С++?

>
> В качестве ид-*** можно использовать адрес объекта. Остальные поля — это
> члены объекта.
> Если идентификация идет по указателю (это очень удобно для доступа), то
> нужно позаботиться о том, чтобы объекты не перемещались при модификации
> базы. То есть хранить их в контейнерах типа std::set, std::list,
> std::map, или же использовать коллекции указателей (желательно умных),
> например std::set< boost::shared_ptr<Address>, less_shared_ptr >.

Будет совсем непросто создать объекты по тем же самым адресам при
следующем запуске.

А вот с использованим UUID в качестве id проблем не должно возникнуть.

--
Maxim Egorushkin
MetaCommunications Engineering
http://www.meta-comm.com/engineering/
Posted via RSDN NNTP Server 1.8 beta
Re[4]: HELP создание класса
От: Кодт Россия  
Дата: 29.12.03 01:34
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Будет совсем непросто создать объекты по тем же самым адресам при

ME>следующем запуске.

А нужно поддерживать целостность. Объект йок — и соответствующие элементы мапа тоже йок.
Можно вместо UUID использовать последовательную нумерацию (каждому объекту присваивать новый номер из глобального счетчика).
Разрядность — не меньше 64бит.
... << RSDN@Home 1.1.0 stable >>
Перекуём баги на фичи!
Re[5]: HELP создание класса
От: MaximE Великобритания  
Дата: 29.12.03 01:51
Оценка:
Кодт wrote:

> Можно вместо UUID использовать последовательную нумерацию (каждому объекту присваивать новый номер из глобального счетчика).

> Разрядность — не меньше 64бит.

Со счетчиком с репликацией и объединением баз намучаешься.

--
Maxim Egorushkin
MetaCommunications Engineering
http://www.meta-comm.com/engineering/
Posted via RSDN NNTP Server 1.8 beta

censored -- ПК.
Re[8]: HELP создание класса
От: Chost  
Дата: 29.12.03 05:01
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Дай угадаю... Ты types.cpp к проекту не подключил...


я же выложил сорсы "Re[4]: HELP создание класса" всё подключено...
Re[6]: HELP создание класса
От: Кодт Россия  
Дата: 29.12.03 09:23
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Со счетчиком с репликацией и объединением баз намучаешься.


Ну речь-то шла о том, как представить базу в памяти программы. Какое там объединение баз? До первого выкла доживет, и всё.
Перекуём баги на фичи!
Re[4]: HELP создание класса
От: Павел Кузнецов  
Дата: 29.12.03 15:19
Оценка:
Здравствуйте, MaximE, Вы писали:

M> Будет совсем непросто создать объекты по тем же самым адресам при

M> следующем запуске.

А это и не обязательно: достаточно обеспечить механизм загрузки, учитывающий
старые указатели при создании новых объектов. Не нужно создавать объекты
по старым адресам, нужно обеспечить эквивалентность графа ассоциаций. Сделать
это можно сравнительно прозрачно для пользователя.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.