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

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

11.03.2020, 10:51. Показов 30599. Ответов 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
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
11.03.2020, 11:04
Лучший ответ Сообщение было отмечено JeyCi как решение

Решение

можно как нибудь так + pimpl'ы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//...
struct Table;
struct Serializer
{
    virtual void operator<<(const Table&) const = 0;
    virtual ~Serializer() {}
};
 
struct Table
{
    //...
    void write(const Serializer& s) const { s << *this; };
};
 
struct CSVSerializer : Serializer
{
    void operator<<(const Table&) const override {/**/ };
    //...
};
 
struct DataGridSerializer : Serializer
{
    void operator<<(const Table&) const override {/**/ };
    //...
};
 
int main()
{
    Table t;
    //...
    t.write(CSVSerializer{/**/});
}
1
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
11.03.2020, 11:10  [ТС]
Проблемы с множественным наследованием

Добавлено через 4 минуты
zayats80888, спасибо...
Цитата Сообщение от zayats80888 Посмотреть сообщение
struct Table;
, честно говоря, struct не очень хотела, т.к. сюда может (и вероятнее всего так и будет) добавится метод join'a этих input-files (по ключевым полям)... но спасибо за внимание к теме - постараюсь понять... пока ещё только начинаю знакомиться с с++ (как отметила в предыдущей ветке)
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
11.03.2020, 11:13
Цитата Сообщение от JeyCi Посмотреть сообщение
struct не очень хотела
struct - это class с public скоупом по-умолчанию(я просто что бы public не писать использовал struct)
1
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
11.03.2020, 11:18  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
struct - это class с public... (я просто что бы public не писать использовал struct)
ну, вобщем-то, да
Язык C++ / Абстрактные типы данных
По умолчанию при объявлении структуры ее данные и функции являются общими, то есть у объектов типа структура нет ни инкапсуляции, ни защиты данных
- беру на заметку...
0
11.03.2020, 11:21

Не по теме:

Цитата Сообщение от JeyCi Посмотреть сообщение
то есть у объектов типа структура нет ни инкапсуляции, ни защиты данных
???
C++
1
2
3
4
5
6
struct s
{
//...
private:
    int val; // хрен обратишься
};

0
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
11.03.2020, 11:50  [ТС]
значит есть - если указать явно... благодарю
p.s. по моему линку по АТД - там даже функции можно сделать...
0
 Аватар для Annemesski
2670 / 1333 / 479
Регистрация: 08.11.2016
Сообщений: 3,682
11.03.2020, 12:29
Цитата Сообщение от JeyCi Посмотреть сообщение
значит есть - если указать явно...
Не "если указать явно", а в принципе есть. Отличие только в модификаторах доступа по умолчанию при объявлении и при наследовании, то есть если наследует структура, то по умолчанию будет public-наследование
C++
1
struct Foo : Base{}; == class Foo : public Base {};
Если наследует класс, то по умолчнию будет private-наследование
C++
1
class Foo : Base{}; == struct Foo : private Base {};
Цитата Сообщение от JeyCi Посмотреть сообщение
p.s. по моему линку по АТД - там даже функции можно сделать...
Вообще в С++ по сути классом можно назвать все что объявлено с помощью ключевых слов class, struct и даже union - они все могут содержать поля и методы, могут наследовать и быть унаследованы и т.д.
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
11.03.2020, 13:01
Цитата Сообщение от Annemesski Посмотреть сообщение
даже union
Поправочка. union - class type, но в наследовании его использовать нельзя.
1
 Аватар для Annemesski
2670 / 1333 / 479
Регистрация: 08.11.2016
Сообщений: 3,682
11.03.2020, 13:17
DrOffset, таки да, разогнался с class/struct, а union имеет более серьёзные отличия от первых
0
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
11.03.2020, 20:56  [ТС]
в 2-х словах отмечу общие нюансы наследования или ненаследования (что отметила для себя):
Путаница между конструкцией и обобщением
здесь
- 1-е (Конструкция) - это наследование (для передачи свойств и методов потомкам с возможностью реализации в потомках и их собственных свойств и методов - т.е. расширение базового класса);
- 2-е (Обобщение) - это создание абстрактных классов...
Абстрактные классы - как гарантия того, что в наследниках будут реализованы опр. методы...
Абстрактные классы могут иметь, как чистые виртуальные функции, так и виртуальные таблицы, которые могут использоваться, если у вас есть указатель или ссылка на Абстрактный Класс...
Множественное наследование не есть хорошо в принципе (особенно, когда у родителей есть общий базовый класс) - т.к. могут в производном появиться 2 и более (в зависимости от того, сколько родителей) экземпляра одного элемента (при ромбовидной структуре наследования)... или просто, когда в классах одноимённые переменные-члены - будет неопределённость... менять имена, договариваться с разработчиками тех классов-родителей, откуда появляется неопределённое поведение, использовать виртуальное наследование...
Интерфейсные классы - содержащие только методы - могут иметь множественное наследование - быть используемыми различными базовыми классами... содержат только методы, не имеют полей... (т.е. по сути они абстрактные с виртуальными методами, но без полей)...
Дружественные классы, как ещё один способ разрулить ромб, - преобразовать порождение из нескольких классов в порождение из 1-го класса и объявить дружественный(е) класс(ы)
===
вроде весь арсенал возможных структурных единиц в проектировании... имхо... ещё банально одиночное наследование... и Виртуальные Базовые Классы...

Добавлено через 2 минуты
===
#2 уже буду обкатывать в коде - пока без комментариев...
в любом случае спасибо, за новые понятия в моём арсенале


Добавлено через 6 минут
базовый Serializer и его производные DataGridSerializer и CSVSerializer - вижу...
Цитата Сообщение от zayats80888 Посмотреть сообщение
struct Table
{
//...
void write(const Serializer& s) const { s << *this; };
};
- а это уже наверно, без какого-либо наследования, просто передачей параметра-результатаSerializerОтработки, чтобы записать куда хочется?? - буду пробовать...

Добавлено через 1 час 49 минут
да и здесь на форуме - Как правильно реализовать множественное наследование? - примеры и вложения последних постов о том, как обрабатывает множественное наследование сам компилятор ... хотя по скрину начала топика - у нас его пока нет... но мало ли потом появится...

Добавлено через 4 минуты
P.S.
там на скрине верхние классы copy-paste'ом делала - поэтому методы одинаковые от базового кл. ... конечно, же правильнее нарисовать внутри потомков соотв. методы... но исправить уже не смогу - просто для инфо

Добавлено через 18 минут
и Проектирование в общем и целом:
- Определение иерархии классов
- Идентификация членов иерархии
и здесь:
В случае одиночного наследования указатель, ссылка или объект производного класса при необходимости автоматически преобразуются в указатель, ссылку или объект базового класса, которому открыто наследует производный. Это остается верным и для множественного наследования.
0
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
12.03.2020, 20:32  [ТС]
Цитата Сообщение от JeyCi Посмотреть сообщение
struct Table - а это уже наверно, без какого-либо наследования, просто передачей параметра-результатаSerializerОтработки, чтобы записать куда хочется??
- вопрос снят
- точнее - всё та же наша собранная таблца Class Table (на скрине) с функцией обращения к I_tbl_Show (Абстрактный класс), 'virtual void оператор<<' которого переопределяется далее в соотв. производных интерфейсных классах...
p.s.
Вобщем, что никакого множественного наследования и никаких виртуальных классов (виртуального наследования) для урегулирования ромба (его тем более нет)... только чистая виртуальная функция Абстрактного класса Serializer...
p.p.s.
Урок №168. Чистые виртуальные функции, Интерфейсы и Абстрактные классы
всё-таки ещё виртуальные таблицы стоит иметь ввиду ДЛЯ позднего связывания, т.е. НЕ на этапе компиляции, насколько понимаю... Урок №167. Виртуальные таблицы
Кликните здесь для просмотра всего текста
Это обычный статический массив, который создаётся компилятором во время компиляции. Каждая запись в этой таблице — это указатель на функцию, указывающий на наиболее дочерний метод, доступный объекту этого класса.
С помощью виртуальных таблиц компилятор и программа могут гарантировать, что вызовы функций будут вызывать соответствующие виртуальные функции/переопределения (override), даже если вы будете использовать только указатель или ссылку на родительский класс!
Вызов виртуальной функции происходит медленнее, чем вызов не виртуальной функции:
 - Во-первых, мы должны использовать *__vptr для перехода к соответствующей виртуальной таблице.
 - Во-вторых, мы должны индексировать виртуальную таблицу, чтобы найти правильную функцию для вызова.
 - И только тогда мы сможем выполнить вызов функции.
Любой класс, который использует виртуальные функции, имеет свой *__vptr, и размер каждого объекта этого класса увеличивается на размер этого указателя, т.к. он реальный в отличие от скрытого указателя *this.

-- только ещё понять остаётся, как ими пользоваться и надо ли?... - в чём выгода??... - если всё равно всё компилируется и компилятор сам расставляет всё по своим местам, независимо от того раннее или поздне связывание - связывает как надо и можно забыть об этом, пользуясь Release'ом разработанного приложения...
но всё-таки, мне кажется, в разработке интерфейсных классов в DLL и/или COMdll - эти вирт. таблицы стоит иметь ввиду? -- хотя там, в принципе, сама библиотека ATL всё имеет ввиду -- только птиц где-то проставить надо в начале разработки... - вопрос снят
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
13.03.2020, 11:40
JeyCi, вам не понятно зачем виртуальные таблицы или зачем полиморфизм в целом нужен?
Виртуальные таблицы - это технический аспект реализации полиморфизма всего лишь.
0
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
13.03.2020, 19:16  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
JeyCi, вам не понятно зачем виртуальные таблицы или зачем полиморфизм в целом нужен?
насколько понимаю, полиморфизм в целом - для расширения классов в том или ином направлении, т.е. для порождения иных разных классов (или даже просто сущностей) от одного родителя...
вот когда использовать виртуальные таблицы - вероятно, когда мне нужно позднее связывание... НО я могу понять, что мне может быть нужно реализовать его, например, в dll или COMdll. т.к. ковыряла надстройку в Borland'e (кстати очень понравилась IDE, только старая и не все библы есть, а на RAD Studio ещё не перешла - там регистрация в Community нужна)...
но не могу понять, если application создаётся на чистом С++, мы компилируем и забываем о нами написанном коде (т.к., вероятно, компилятор делает все нужные ему name mangling (also called name decoration), и/или даже вообще переводит код в ассемблер)... вобщем стоит ли мне в коде на чистом С++ использовать позднее связывание -- оно медленнее раннего, но ? отразится ли на конечном Build'e appl'a... и есть ли хоть какая выгода в позднем связывании, кроме его использования в, например, интерфейсе, реализованном в надстройке на С++, но используемом, например, в Excel -- там в принципе, часто подключаем библу поздним связыванием и это просто удобно...
т.е. не-совсем-понимание, наверно, КОГДА стоит заворачиваться в коде на указателях на эти виртуальные таблицы? (если писать appl на чистом C++) - ГДЕ от этого будет Profit?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
13.03.2020, 19:25
Цитата Сообщение от JeyCi Посмотреть сообщение
КОГДА стоит заворачиваться в коде на указателях на эти виртуальные таблицы?
Я же написал, виртуальные таблицы - это деталь реализации полиморфизма. Если вы используете полиморфизм классов в С++, вы автоматически используете виртуальные таблицы.
1
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
13.03.2020, 19:46  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Если вы используете полиморфизм классов в С++, вы автоматически используете виртуальные таблицы.
логично! - когда даём ссылку на метод...
спасибо
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
13.03.2020, 19:50
Цитата Сообщение от JeyCi Посмотреть сообщение
когда даём ссылку на метод...
Когда просто вызываете любую виртуальную функцию.
1
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
14.03.2020, 12:07  [ТС]
хм, просто подумала, что вызов виртуальной функции класса и вызов простого метода класса - примерно одинаково по синтаксису можно использовать...
Ссылка на метод класса
Как получить указатель на метод объекта?
(и виртуальные вызывать можно также подумала)
+
__vptr сама по себе -
Каждая запись в этой таблице — это указатель на функцию
поэтому так и выразилась
p.s.
Ссылка - это скрытый указатель
- насколько помню *ptr=&objClass

Добавлено через 7 минут
p.p.s.
Указатели на функции-члены и реализация самых быстрых делегатов на С++.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
14.03.2020, 12:31
Цитата Сообщение от JeyCi Посмотреть сообщение
м, просто подумала, что вызов виртуальной функции класса и вызов простого метода класса - примерно одинаково по синтаксису можно использовать...
А при чем тут синтаксис?
Виртуальные таблицы используются неявно. Компилятор генерирует соответствующий код с их использованием.

Добавлено через 6 минут
JeyCi, вообще мне кажется вы путаете реализацию и собственно язык. Для того, чтобы программировать на С++ в обычных условиях не нужно знать о каких-то там виртуальных таблицах. Их вообще в стандарте языка нет. Т.е., теоретически, в какой-то реализации вообще может не быть этих таблиц нигде, а полиморфизм, RTTI будут реализованы как-то по-другому (хотя на практике я лично с таким не сталкивался).

В этой статье, которую вы выше скидывали, эти таблицы поданы почему-то как языковая фича, хотя это фича реализации языка, а не самого языка. Очень важно понимать эту разницу. Поэтому ваше сосредоточение на реализации в данный момент не оправдано.
0
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
14.03.2020, 13:12  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Виртуальные таблицы используются неявно.
да язык меня интересует... -
* или & ставить или нет, обращаясь к методу?..
что более memory-efficient? (а в этом контексте и реализация не маловажна... имхо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.03.2020, 13:12
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru