Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.52/131: Рейтинг темы: голосов - 131, средняя оценка - 4.52
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549

Архитектура: парсинг и выгрузка текстовиков

11.03.2020, 10:51. Показов 32513. Ответов 421

Студворк — интернет-сервис помощи студентам
начало было положено в ветке - Считать текстовые файлы из папки - там и возник вопрос об Архитектуре...
Цитата Сообщение от JeyCi Посмотреть сообщение
так и не собрала эти все объекты этого класса в group class...
вроде уже собрала...
осталось отображение создать (типа I_tbl_Show) и пронаследовать ? в разные классы пункта назначения (или на консоль, или в файл, или в БД, или допустим ещё в форму)... N.B. классы (пункты-назначения) делать не надо - эти View уже реализованы разработчиками того ПО, на котором сейчас идёт работа...
а) пока что можно просто прописать функции-члены класса; и по месту использовать, что надо при разработке - в файл или на консоль;
б) в перспективе для Release - реализовать и откомпилировать и выгрузку и в файл, и выгрузку в БД, и отражение в DataGrid...
===
!! Т.Е. если в Release захочется и выгрузку в текст, и в БД, и допустим ещё в форму (например с разных кнопок сделать) - тут уж лучше и писать, как положено, наследование??... -- к слову из прошлой ветки о:
Цитата Сообщение от JeyCi Посмотреть сообщение
полагаю тут Наследования никакого не пригодится?
... или как раз тут (при выборе направления выгрузки) его (наследование) делать??
===
Обоснование выбора уровня Абстракции (I_tbl_Show со всеми виртуальными функциями):
чтобы не дублировать код-сбора-для-выгрузки -- сделать class Table - и класс-интерфейс I_tbl_Show, в котором обозначить virtual-функции выгрузки... эти функции определить в др. классах - типа Interface (IwriteCSV, IwriteDB, IwriteDataGrid)...
p.s.
классы консоль, файл, бд, DataGrid - не создаём, т.к. эти пункты назначения уже присутствуют...
p.p.s.
вывести конечные интерфейсы с определёнными методами записи на кнопки...
===
ИЛИ то, что подчёркнуто чуть выше, стоит реализовать в одном классе Table, и здесь же задать все virtual функции ??
===
на скрине: синие - классы, зелёные - интерфейсы (в с++ по сути тоже классы)
птицами отмечены уже кое-как реализованные классы (2 птицы)
курсивные стрелки - отсутствие наследования


Добавлено через 7 минут
вобщем вопрос:
class Table и класс I_Tbl_Show - объединить или нет?

Добавлено через 10 минут
p.p.s.
чтобы избежать проблем Ромба и такого:
Неоднозначность при множественном наследовании
Цитата Сообщение от DrOffset Посмотреть сообщение
Тут нужно виртуальное наследование.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.03.2020, 10:51
Ответы с готовыми решениями:

Проверка двух текстовиков
Написать прогу на языке Си, проверяющую, совпадают ли тексты в двух файлах #include <stdio.h> #include <stdlib.h> ...

Access модуль объединения текстовиков
Добрый день. Очень нужен модуль access который будет объединять текстовые файлы с предложенной папки (каждый раз разные названия и...

Сделать скрипт для вывода текстов из текстовиков
Здравствуйте! Не могли бы помочь сделать скрипт для вывода текстов песен из текстовиков в папке. Расскажу подробней: есть папка с...

421
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
14.03.2020, 13:12  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DrOffset Посмотреть сообщение
Виртуальные таблицы используются неявно.
да язык меня интересует... - * или & ставить или нет, обращаясь к методу?..
что более memory-efficient? (а в этом контексте и реализация не маловажна... имхо)
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
14.03.2020, 13:31
Цитата Сообщение от JeyCi Посмотреть сообщение
* или & ставить или нет, обращаясь к методу?..
В каком контексте?
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
14.03.2020, 16:36  [ТС]
в принципе, да - там по статье и указано
Многие компиляторы (например, MSVC) разрешат вам пропустить взятие адреса (&), но более соответствующие стандарту (например, GNU G++) потребуют этого. Так что если пишете портируемый код, то не забывайте &.
а *ptr=&ptr, насколько знаю... поэтому последнее не имеет значения, а первое по желанию...
p.s.
множественного наследования и виртуального наследования (для обхода ромба) у меня пока нет -- поэтому пока вопрос снимается (ввиду практической непотребности на данном этапе)... пример с ходу не приложу
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
14.03.2020, 18:02
JeyCi, все, что вы выше написали про & - это синтаксические правила. Каким образом тут "memory-efficient"? Синтаксис в общем случае никак не влияет на это.
Поэтому повторяю вопрос: уточните контекст, что вы хотите применять, где, как вы считаете, может пострадать memory-efficient? Примеры контекста применения, пожалуйста, дайте.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
15.03.2020, 06:53  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Каким образом тут "memory-efficient"?
1)вызов функции или вызов функции по ссылке/указателю...
2)по аналогии с вызов самой функции с параметрами, переданными ByVal или ByRef - особенно, если передаются массивы - тут уж точно memory-efficiency очевидна... как и при передаче ссылок на объект класса или самих объектов класса...
(думала, что между 1-м и 2-м можно провести аналогию по потреблению памяти)... полагаю, что для memory-efficiency всегда лучше передача по указателю (только если вызываем не const элемент класса, иначе бесполезно, если значение надо изменить)...
что касается функций, то, думала, такая же ситуация - либо несколько раз располагаем функцию в памяти, каждый раз со своими входящими параметрами (при многократном использовании)... или даём ссылку на функцию... и не создавая новую копию, прогоняем через неё любые параметры...
НО пока по цитате выше вижу, что даже без указаня */& многие компиляторы всё равно будут использовать указатель/ссылку на функцию-член (параметры отдельная история)...
примеры любые, самые обыкновенные можно брать (там же по статье указаны и примеры синтаксиса - не хочу перепечатывать)...

Добавлено через 5 минут
на вариант, если возможен, использования компилятором функции не по указателю/ссылке - пример не покажу... как можно прикладывать пример того, чего не знаю где и как и бывает ли... ещё раз обратить внимание на цитату и на статью
даже если */& не указаны - всё равно по факту используется */& на функцию-член
Добавлено через 9 минут
нельзя использовать указатель на функцию-член для статического метода. В этом случае нужно использовать обычный указатель на функцию (так что название «указатель на функцию-член» несколько некорректно, на самом деле это «указатель на нестатическую функцию-член»
Функции-члены классов несколько отличаются от стандартных функций. Кроме обычных параметров они принимают скрытый параметр, называемый this, который указывает на объект класса.
Чтобы указатель на функцию-член указывал на метод класса SomeClass::some_member_func(int, char*),
нужно выполнить следующую инструкцию:
my_memfunc_ptr = &SomeClass::some_member_func;
Указатель на функцию-член класса SomeClass, с теми же аргументами, что и ранее, объявляется следующим образом:
float (SomeClass::*my_memfunc_ptr)(int, char*)
// Для константных функций-членов используется объявление
float (SomeClass::*my_const_memfunc_ptr)(int, char*) const;
При использовании указателей на функции-члены всегда следует использовать typedef, во избежание ошибок и лишних неприятностей.
там всё по статье (опять же "многие компиляторы понимают и без */& ")
... нюансы при множественном и виртуальном наследовании там далее (пока не вникала) - для инфо... но я пока их не использую - поэтому не покажу...
p.s.
если что-то будет не работать у меня - покажу
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
16.03.2020, 06:37  [ТС]
по Архитектуре - в своё время понравилась статья на habr'e
(она же во вложении)
===
и книга, хоть и C#, - Принципы, паттерны и методики гибкой разработки на языке C#. Роберт Мартин
правда, на habr'e - есть Критика книги Боба Мартина
-- но пример в конце книги по зар.плате - показался интересным (и последние главы про БД и MVC)... и вообще в ней много интересных схем дизайна и примеров применения SOLID (независимо от языка)
Вложения
Тип файла: zip habr - как проектировать табуретку.zip (436.4 Кб, 0 просмотров)
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
16.03.2020, 07:02  [ТС]
и на всякий случай оставлю линк на пока ещё слабое моё место - Understanding and Using C Pointers. R. M. Reese - хотя можно рассматривать и как тему для новой ветки
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
16.03.2020, 09:39
JeyCi, для C++ есть книга: Гибкая разработка программ на Java и C++. Принципы, паттерны и методики. Этого же автора.

Добавлено через 1 час 4 минуты
Цитата Сообщение от JeyCi Посмотреть сообщение
полагаю, что для memory-efficiency всегда лучше передача по указателю
Не всегда. Нужно учитывать контекст. Поэтому я вас и спрашивал о нем.

Цитата Сообщение от JeyCi Посмотреть сообщение
как можно прикладывать пример того, чего не знаю
Контекст - это не пример, контекст - это то, что вы хотели выразить на языке и применительно к какой задаче. Это не код, это описание словами: "я хочу сделать то и то". Никак у меня от вас добиться этого не получается.

Вы так быстро бежите по материалу, и по вашему описанию очень похоже, что вы скоро сильно запутаетесь.

Вот, например, это:

Цитата Сообщение от JeyCi Посмотреть сообщение
либо несколько раз располагаем функцию в памяти, каждый раз со своими входящими параметрами (при многократном использовании)... или даём ссылку на функцию...
Что такое "несколько раз располагаем функцию в памяти"? Функция в памяти одна всегда, если это не так, то значит мы где-то нарушили ODR - поведение такой программы не определено.

Цитата Сообщение от JeyCi Посмотреть сообщение
* или & ставить или нет, обращаясь к методу?..
Оказывается тут вы имели в виду не вызов метода. а взятие его адреса. Ставить & для взятия адреса нестатической функции-члена нужно обязательно. Ссылки на нестатические функции члены язык не позволяет создавать - только указатели.

Если ваш изначальный вопрос состоял в том, что выгоднее вызывать функцию непосредственно, или использовать указатель на функцию, то ответ опять же один: зависит от того что вам нужно сделать. Какого-то единого рецепта - нет. У этих механизмов разное назначение. Могу предложить такое эмпирическое правило: "если вы не знаете зачем вам в коде нужен указатель на функцию, то вы не должны использовать его". В большинстве стандартных ситуаций, где вам нужен вызов функций, непосредственный вызов даст самый оптимальный код из возможных.
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
16.03.2020, 11:36  [ТС]
да, вы правы - есть большие сомнения, например, по такому (из той вложенной статьи)
Все зависимости должны быть в виде интерфейсов
"Все зависимости должны быть в виде интерфейсов».

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

Понятно, что этого нельзя избежать и объекты где-то должны создаваться. Но, по крайней мере, нужно свести к минимуму количество мест, где это делается и в которых явно указываются классы, а также локализовать и изолировать такие места, чтобы они не были разбросаны по всему коду программы.


просто получается на каждую record (распарсенную) нужно создавать свой new (многовато?!), потом хочу по ссылке его void add_rec(elRecord) в Table. и потом уже по ссылке эту Table в ostream, или в DB... так вот пытаюсь declaration & initialization сделать одновременно:
C++
1
elRecord* r= elRecord(a,b,c)  //не работает
имею приватные a,b,c и 2 конструктора в классе:
C++
1
2
elRecord();
elRecord(int a, long b, String c) {elRecord::a=a; elRecord::b=b, elRecord::c=c};);
- не хочу много new использовать, но запись первая не работает, а работает такая:
C++
1
2
3
4
elRecord *r;
r->setA;
r->setB;
r->setC;
но потом при передаче в classTable
C++
1
classTable.add_rec(r)
в функции-члене classTable'a
C++
1
2
3
4
     // м-д заполнение    
      void add_rec(elRecord* ps) { 
      m_table.Add(ps); 
      };
в приватах которого
C++
1
Vector <elRecord*> m_table;
- получаю, что принимает только 2 записи и выдаёт ошибку *ptr=0
... а всего лишь не хочу писать new на создание каждого объект class elRecord...
а в итоге в class Table::add_rec(r) как-то не так указатели доходят...
вот пока и думаю, как тут лучше выразиться
===
DrOffset, спасибо за внимание к теме! - просто пока ещё, наверно, так много не совсем понимаю, что с трудом связываю, несколько строк, поэтому и примера приложить не могу с конкретным вопросом - просто экспериментирую и по-тиху продвигаюсь вперёд (чтобы не тупо копи-пастом из примеров в сети, а всё-таки находить самые ! красивые - т.е. быстрые и краткие - решения)....
===
?? а по цитате под спойлером - так вообще пока не знаю как это сделать, чтобы конструктор не зашивать в классс?? (возможно ли?), а сделать интерфейс (фабрику, насколько, поняла) - вероятно, для создания всех этих new... ??
===
вот на таком распутье я сейчас
(вся работа - в классах elRecord и Table, не в структурах)
p.s.
слова Add to vector, сам Vector, и String - определены в IDE

Добавлено через 11 минут
#include <Core/Core.h>
using namespace Upp;
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
16.03.2020, 12:20
Цитата Сообщение от JeyCi Посмотреть сообщение
elRecord
Это что такое? Абстрактный класс?

Добавлено через 6 минут
Если не абстрактный класс, то:

Цитата Сообщение от JeyCi Посмотреть сообщение
C++
1
elRecord* r= elRecord(a,b,c) //не работает
C++
1
elRecord r(a,b,c);
Цитата Сообщение от JeyCi Посмотреть сообщение
C++
1
2
elRecord();
elRecord(int a, long b, String c) {elRecord::a=a; elRecord::b=b, elRecord::c=c};);
C++
1
2
3
4
elRecord() : a(), b(), c() 
{ }
elRecord(int a, long b, String c) : a(a), b(b), c(c) 
{ }
Цитата Сообщение от JeyCi Посмотреть сообщение
C++
1
2
3
      void add_rec(elRecord* ps) { 
      m_table.Add(ps); 
      };
C++
1
2
3
      void add_rec(elRecord const & ps) { 
          m_table.Add(ps); 
      }
Цитата Сообщение от JeyCi Посмотреть сообщение
C++
1
Vector <elRecord*> m_table;
C++
1
Vector <elRecord> m_table;
Обратите внимание, я убрал мусорные точки с запятой, которые вы везде расставляете и изменение в конструкторе - вернее всего использовать список инициализации вместо присваивания. Это в дополнение к собственно к передаче по значению. Вообще value-семантика - это сильная сторона С++, пользуйтесь ей настолько часто, насколько это возможно.
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
16.03.2020, 15:37  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Это что такое? Абстрактный класс?
вроде не вижу повода делать его абстрактным?..
Цитата Сообщение от DrOffset Посмотреть сообщение
в конструкторе - вернее всего использовать список инициализации вместо присваивания.
вот тут не совсем поняла - но ведь все геттеры и сеттеры я оставляю? - типа такого:
C++
1
2
void setA(int cnt) { this->a = a; };
int getA() const { return A; };
Цитата Сообщение от DrOffset Посмотреть сообщение
Это в дополнение к собственно к передаче по значению. Вообще value-семантика - это сильная сторона С++, пользуйтесь ей настолько часто, насколько это возможно.
вот тут я и думала, что указатели лучше - чтобы не дублировать value в памяти... имхо
В ЛЮБОМ СЛУЧАЕ:
!! Thanks a lot - собрала в Table 1 вид файлов ok... и конструктор стал покороче благодаря вам... и от new в main'e избавилась... точки с запятыми буду стараться минимизировать, но пока ставлю, где помню...
p.s.
но собирать надо 3 разных вида файлов... это лучше использовать/переделать на Абстрактный класс?.. вобщем, сейчас покручу/почитаю/подумаю ещё... может Фабрику (Abstract Factory) какую замутить из паттернов?

Добавлено через 10 минут
всё-таки перешла на using namespace std;
и только где парсинг using namespace Upp; - иначе там Vector какой-то странный в Core.h всё указатели вроде хотел... (- не полезла изучать библу)
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
16.03.2020, 16:18
Цитата Сообщение от JeyCi Посмотреть сообщение
но собирать надо 3 разных вида файлов... это лучше использовать/переделать на Абстрактный класс?
Не обязательно. Но возможно.
std::variant<T1, T2, T3> еще рассмотрите.

Добавлено через 57 секунд
Цитата Сообщение от JeyCi Посмотреть сообщение
чтобы не дублировать value в памяти...
Не вижу где тут дублирование?)

Добавлено через 39 секунд
Цитата Сообщение от JeyCi Посмотреть сообщение
но ведь все геттеры и сеттеры я оставляю?
Не знаю. Возможно надо оставить - от применения класса зависит.

Я бы проектировал класс исходя из того, что у него не будет сеттеров. Т.е. все необходимые данные вычисляются или задаются в конструкторе. Если нужен объект этого класса с новыми данными, то создается другой объект с другими аргументами конструктора.
Так не всегда получится сделать (т.е. сеттеры определенно нужны в некоторых ситуациях), но класс с сеттерами, как вариант класса по умолчанию, я бы рассматривать не стал.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
16.03.2020, 17:40  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Я бы проектировал класс исходя из того, что у него не будет сеттеров. Т.е. все необходимые данные вычисляются или задаются в конструкторе. Если нужен объект этого класса с новыми данными, то создается другой объект с другими аргументами конструктора.
очень интересная мысль!
Цитата Сообщение от JeyCi Посмотреть сообщение
Abstract Factory
лучше, наверно, Factory Method
Цитата Сообщение от DrOffset Посмотреть сообщение
std::variant<T1, T2, T3> еще рассмотрите.
но если это проще, то посмотрю - только есть ли для c++v.11? или для 11 - только в std::vector< boost::variant<T1,T2,T3>*>?.. вобщем надо смотреть...
p.s.
а вообще - по совету с planetaexcel (куда оставляла линк выше) - unordered map пошустрее может оказаться - если потом join'ить придётся 3 типа файлов...
std::unordered_map. Поиск, вставка и удаление выполняются за константное время.
подумаю - может уйти от vector

Добавлено через 42 минуты
P.S.
Хотя... abstract-factory
/**
* Интерфейс Абстрактной Фабрики объявляет набор методов, которые возвращают различные абстрактные продукты. Эти продукты называются семейством и связаны темой или концепцией высокого уровня.
Продукты одного семейства обычно могут взаимодействовать между собой. !!!
Семейство продуктов может иметь несколько вариаций, но продукты одной вариации несовместимы с продуктами другой.
*/
честно говоря можно в семейство загонять то, что потом join'ить захочется... НО дублировать придётся тут уж точно... или как-то проиндексировать... т.к. 1 тип1 файла может соотв 2-n файлам тип2 и эта связка 3-n файлам тип3... да , Архитектура важна...
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
16.03.2020, 18:47
JeyCi, можете в целом описать задачу, которую решаете? Я посмотрел другие ваши темы, но цельной постановки задачи не нашел. Что-то связанное с файлами? Можете развернуть подробнее?
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
16.03.2020, 20:20  [ТС]
Цитата Сообщение от JeyCi Посмотреть сообщение
т.к. 1 тип1 файла может соотв 2-n файлам тип2 и эта связка 3-n файлам тип3
просматривается как бы Компоновщик (Composite) ...
НО по сути у нас "всё-есть файлы" (почти как Linux ) - 3 разных View, которые надо запихать в бизнес логику... и оттуда ещё выходных несколько View сделать (мало ли куда захочется закинуть эту Table или просто вывести в файл или на консоль)...
Т.Е. по сути у нас, видимо 1 уровень абстракции на входе, aka файл... и его разновидности... по сути - древовидные... по сути join от корня(ей) можно будет делать... обход дерева мне, наверно, полезнее полистать, чем паттерны... т.к. уровень абстракции, вероятно, по сути Один - наверно, всё проще и на данном этапе для данной задачи я зря так "искусственно" пытаюсь самой задаче навязывать какие-то паттерны... ок, постараюсь не усложнять

Добавлено через 20 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
Что-то связанное с файлами? Можете развернуть подробнее?
Цитата Сообщение от JeyCi Посмотреть сообщение
т.к. 1 тип1 файла может соотв 2-n файлам тип2 и эта связка 3-n файлам тип3
Цитата Сообщение от JeyCi Посмотреть сообщение
и его разновидности... по сути - древовидные...
и я хочу join'ить по дереву к примеру (упрощённо):
Продукт1
-цены за период1
-- реализация за период1.1
-- реализация за период1.2
-цены за период2
-- реализация за период2.1
-- реализация за период2.2
Продукт2
(такая же история)
===
1) т.е. json'ы по (условно продукту) имеют ключи к json'ам (условно) цены, которые имеют ключи (немного другие) к (условно) реализации товара по сути... в другой последовательности не с'join'ить (т.к. полный ключ для 2-ого join появляется только после 1-го join)... файлы беру из сети (пока тупо в txt скидываю, в перспективе можно и с http брать - это потом)...
2) из папок хочу собрать нужный (не знаю какой лучше итоговый контейнер, по сути "recordset" на выходе нужен для заброса в БД, пока вся логика на Access - в перспективе может на MS SQL Server Express - но всё для home use, не для сетевой версии пока!)... возможно "recordset"(vba'шный) на с++ представить в итоговый tuple (чтобы потом бросать в бд)
3) или unordered map, чтобы вначале c'join'ить...
(4) не хочу join'ить на C# LINQ to Json (тоже не знаю его)...
(5) не хочу join'ить на стороне сервера (не уверена, что со всеми нюансами Access будет join'ить быстро)...
6) да и парсинг всё равно нужен (т.к. текстовые поля надо будет приводить к единообразию логическому для бд)
(7) не хочу excel Power Query -
p.s.
и такой нюанс как в схеме отразила - там в 3х уровнях файлов грануляция к всё более мелкому делению по ключам... (надеюсь, понятно выразилась)... но как-то так...
p.p.s.
по сути забрасывать в бд в итоге... но хотелось бы и в файл (csv), и на консоль - посмотреть.. как-то так

Добавлено через 56 минут
p/p/p/s
но из всех разных json по сути чтение встроенной в U++ библиотекой в json.h... читаются только с раскладкой в разные классы (3 вида пока, как описала, вряд ли будет больше, но это не от меня зависит, а от источника стороннего)... = это то, что пытаюсь на данном этапе изобразить - их чтение... и хотя бы в csv или на консоль... про бд и предварительный join, наверно, буду думать потом...
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
17.03.2020, 08:29  [ТС]
для класса Table сделала перегрузку оператора вывода:
C++
1
2
//в классе
friend std::ostream &operator<<(std::ostream &out, DataBase const  &data);
C++
1
2
3
4
5
6
7
8
9
//за классом
std::ostream &operator<<(std::ostream & out, DataBase const & data) 
{ 
    out << "column A: ";
    for (int index = 0; index < data.m_table.size(); ++index)
        out << data.m_table[index].getA() << ' '; 
    out << '\n';
    return out;
}
- чтобы отразить в консоль.
радует, что для выгрузки группового класса не пришлось перегружать и operator[]...

Добавлено через 33 минуты
можно и просто функцию-член void Print()
C++
1
2
3
4
5
void Print() {          
    cout << "A & B columns: ";
    for (int index = 0; index < m_table.size(); ++index)
    cout << m_table[index].getA() << ' ' << m_table[index].getB()  << "\r\n";           
}
Добавлено через 16 минут
и функция-член void SaveFile(String fn)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void SaveFile(String fn) {       
        FileOut out(fn);        
        if(!out) {
            LOG("Failed to open the file");
            return;
        }
 
        String b;
        for (int index = 0; index < m_table.size(); ++index) {          
           b  << m_table.at(index).getCNT() << "|" << m_table.at(index).getA() << "|" << m_table[index].getB() << "\r\n";   
            }           
        out << b;       
        out.Close();
        DUMP("Data Exported");    //U++ IDE namespace upp
}

Добавлено через 6 минут
НО вот этот уровень Абстракции? - выгрузка - уже, наверно, никак не задать?... т.к. всё равно у каждого файла будут свои поля-члены, поэтому и в каждый класс лучше добавить свою функцию-член void Print()... т.к. несколько разных перегрузок сделать для << , наверно, никак, только если банально switch case type_id(obj).name??... но это не очень по ООП...
сделать универсальную функцию для выгрузки любого группового класса, вероятно, никак?
p.s.
или делать class IPrint - интерфейс с множественным наследованием и виртуальными функциями...
не понятно что лучше с точки зрения Архитектуры?? и какой?

Добавлено через 9 минут
p.p.s.
ХОТЯ, наверно, стоит покрутить #2 - а то уж совсем в Абстракции понесло...
но Абстракции по входящим файлам так же остаются под вопросом?..
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
17.03.2020, 08:48
Цитата Сообщение от JeyCi Посмотреть сообщение
стоит покрутить #2
Да, смысл есть.

Цитата Сообщение от JeyCi Посмотреть сообщение
но Абстракции по входящим файлам так же остаются под вопросом?..
Посмотрите как устроены библиотеки вроде boost.serialization. Там полно идей для вашей задачи.

Добавлено через 3 минуты
Цитата Сообщение от JeyCi Посмотреть сообщение
.е. json'ы по (условно продукту) имеют ключи к json'ам (условно) цены, которые имеют ключи (немного другие) к (условно) реализации товара по сути
А почему бы не грузить эти json`ы сразу в БД? В качестве БД взять какой-нибудь SQLite, у него нет сервера, он целиком встраивается в программу. Позволяет размещать базу прямо в памяти и работает очень быстро.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
17.03.2020, 09:21  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
SQLite
его же вроде уже MS не поддерживают...
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
17.03.2020, 09:41
Цитата Сообщение от JeyCi Посмотреть сообщение
его же вроде уже MS не поддерживают...
Что? При чем тут MS?
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
17.03.2020, 12:56  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
размещать базу прямо в памяти и работает очень быстро.
уже MS SQL Server LocalDB вроде ему на смену пришёл
MS - Microsoft
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.03.2020, 12:56

В указанном dsn архитектура драйвера и архитектура приложения не соответствуют друг другу
Добрый день. При запуске программы выскакивает вот такая вот ошибка. В чем может быть проблема и как ее исправить?

архитектура процессоров и компьютерная архитектура,Intel32. для первокурсников
сабж. кто чем может помочь юному,непонемающему в этой области человеку.желательно книгами.спасибо.

Ошибка "в указанном dsn архитектура драйвера и архитектура приложения"
Вот такая ошибка при нажатии на кнопку &quot;Проверить соединение&quot; Я прочитал, что это возможно из за того, что моя система 64, а...

Архитектура бд
Я начинающий php-разраб. Пишу свой проект для своего города. Но встал вопрос о архитектуре. Пользователь создает свою страницу с...

Архитектура БД
Доброго времени суток.Задание написать АИС Учёт абонентов телефонной сети предприятия. Краткое описание предметной области: В состав...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Теория всего 6. Судьба неотвратима?
anaschu 21.07.2026
Математическое доказательство Судьбы: Точка бифуркации в едином тензорном ядре Модели ВсегоСвежее обновление питоновского ядра «Soil Chemistry 2. 0» дало нам неопровержимое математическое. . .
Теория всего 5. ядро Теории Всего: Математический изоморфизм репликаторов и иллюзия свободы воли
anaschu 21.07.2026
Единое ядро Теории Всего: Математический изоморфизм репликаторов и иллюзия свободы воли Главная задача «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы» (аттракторов. . .
сукцессия 37. Внедрил дипсик в свой оркестр из ИИ. У него закончилось пространство чата, потому опубликую выводы из его работы здесь
anaschu 21.07.2026
==================================================================== КОНТЕКСТ: Моделирование микоризной сукцессии (AM → ECM) ==================================================================== . . .
сукцессия 36. Делаю прогоны модели около порога бифуркации (превращения эндо микоризы в экто микоризу)
anaschu 21.07.2026
СУКЦЕССИЯ МИКОРИЗ: КАК МАТЕМАТИКА ОБЪЯСНЯЕТ ПОДЗЕМНУЮ ВОЙНУ Мы привыкли думать, что лес — это деревья. А грибы — это то, что мы собираем в корзинку осенью. Но если заглянуть под землю, окажется,. . .
ИИ и человечность
kumehtar 21.07.2026
Забавно, что общаясь с ИИ, я замечаю, насколько он высказывается умно, и насколько верит в людей. Он умеет прощать. Он знает как отвечать не обесценивая опыт других людей, даже если сам не верит. Он. . .
Нейтральные знания ..., ... чистая наука. Пока что-то проходит модерацию на Хабре, стоит развить мысль ...
Hrethgir 20.07.2026
К таким радикальным взглядам я конечно в той публикации не приходил, но чтобы скоротать вечер, решил углубиться немного. 1. Почему показания термометра заряжены целью? Цель заложена в самом. . .
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru