0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
|
|||||||||||
1 | |||||||||||
Создание объекта класса в методе этого же класса19.06.2016, 09:54. Просмотров 3036. Ответов 16
Метки нет Все метки)
(
собственно вопрос. можно ли создавать объект класса в методе того же класса? насколько это правильно и как это можно сделать (если это правильно) или же как этого не делать (если это не правильно)
суть проблемы. пользователь вводит марку модель продукта и его кол-ва преступаемого на склад. эти данные принимаются методом класса, далее происходит проверка есть ли в бинарном файле объект с подобными характеристиками - если есть - изменить кол-во уже имеющегося объекта, если же нет, различаеться марка или модель товара - записать объект в файл. для чтения бинарного файла мне необходим размер объекта, для этого я создаю объект класса в самом классе и sizeof определяю его размер. вообще я даже не уверен, что в этом ошибка, программа аварийно завершается, valgrind я читаю с большим трудом (да ладно врать то, вообще не понимаю чего он мне пишет)) но а) все таки хотелось бы понять делают ли так б) может ткнете еще носом где я накосячил?? Спасибо братья ))) wire.h
0
|
|
19.06.2016, 09:54 | |
Возможно ли создание объекта шаблонного класса в функции этого класса? Вызов метода класса в лямбде-функции, вызываемой в другом методе этого же класса Указатель метода класса в другом методе этого класса Построение описания класса, создание и уничтожение объектов этого класса |
|
6914 / 5979 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
|
|
19.06.2016, 10:19 | 2 |
Можно.
sizeof() не применим к твоему классу (так же как и запись объекта целиком). Т. е. это скомпилируется, но результат будет не тот, который ты ожидаешь. Исправь сначала это.
0
|
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
|
|
19.06.2016, 11:05 [ТС] | 3 |
эм, не совсем понимаю почему sizeof не применим??? у Лафоре и на просторах тырнета я находил именно такой способ записи объектов в бинарные файлы? эм, исправить что и на что... просто другого способа записи объекта я пока не знаю. Не могли бы подсказать, чем плохо выбранный мною метод?
Добавлено через 9 минут эм... или вы имеете в виду необходимость делать, эм... рпеобразование типа путем применения reinterpret_cast??? Добавлено через 16 минут или же вы намекаете на необходимость изучения сериализации данных? мне бы просто понять куда копать и почему sizeof мне не подходит?
0
|
6914 / 5979 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
|
|
19.06.2016, 11:43 | 4 |
sizeof применим, если в классе простые типы: int, char и т. п. А если там классы использующие динамическую память, контейнеры, то записывать нужно индивидуально. Для string записывается количество символов и содержимое.
В общем будет несколько read()/write() для твоего класса.
1
|
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
|
|
19.06.2016, 11:59 [ТС] | 5 |
эм, т.е. если я изменю тип данных полей класса с string на char* это избавит меня от пока не доступных мне танцов с бубном?
0
|
184 / 192 / 48
Регистрация: 25.08.2011
Сообщений: 793
|
|
19.06.2016, 12:18 | 6 |
Здравствуйте. Нет не избавит sizeof(char*) = 4 при 32 битах в не зависимости от данных на которые он указывает
0
|
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
|
|
19.06.2016, 12:22 [ТС] | 7 |
эм, я пытаюсь понять пути выхода из ситуации... эм? boost::serialization ? мне бы что нибудь попробще, я с stl то еще не разобрался, не то, что с boost
0
|
184 / 192 / 48
Регистрация: 25.08.2011
Сообщений: 793
|
|
19.06.2016, 12:26 | 8 |
попробуйте перегрузить ofstream& operator<<(); и использовать его. Ну или же писать членны данные в файл отдельно
1
|
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
|
|
19.06.2016, 12:31 [ТС] | 9 |
писать отдельно? тогда суть использовать бинарного файла? не проще ли будет использовать просто тектовый доступ? но в текстовом варианте я уже реализовывал, мне бы хотелось разобраться именно с бинарным и с использованием его преимущества перед текстовым вариантом - т.е. возможность записывать объекты класса. Но все равно спасибо )))
0
|
184 / 192 / 48
Регистрация: 25.08.2011
Сообщений: 793
|
|
19.06.2016, 13:00 | 10 |
ем я просто сомниваюсь что у вас выйдет string написать без почленной записи. поможет если заменить string на char[] со статической длинной. но это плохое решение. при сереализации скорее все го бы был выбран некий формат данных аля длина строки - строка и т.д.
1
|
6914 / 5979 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
|
|
19.06.2016, 13:27 | 11 |
Для тебя бинарный, это если объект целиком записывается, что ли?
Использование древних строк создаст свои сложности - с выделением памяти, или с ограниченной длинной для массива, невозможностью сравнивать простыми операциями. В общем делай запись отдельных полей, она ничем не отличается от записи целиком, только длину не забудь для string.
0
|
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
|
|
19.06.2016, 14:17 [ТС] | 12 |
эм, да, а разве не в этом смысл бинарного файла? нет? я думал что как раз да - берез объект эм, или структуру (но в моем случае объект класса) и пишешь его в бинарный файл, что избавляет от разбора строки и инициализации полей объекта при текстовом формате, я не правильно понимаю назначение бинарного способа записи/чтения? Не могли бы подсказать тогда?
а то я начал читать доки по boost эм, видимо, мое кунг-фу еще не совсем кунг фу (((
0
|
6914 / 5979 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
|
||||||
19.06.2016, 14:45 | 13 | |||||
Бинарный, значит копируется внутреннее представление из памяти в файл. Но если твой класс не хранится в непрерывной области, а в нескольких разных, то и запись должна это учитывать.
Тебе не надо ничего разбирать. Пример:
1
|
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
|
|
19.06.2016, 14:49 [ТС] | 14 |
эм, а как понять храниться мой класс в непрерывной области или нет? что есть непрерывная область? Как узнать что он в нескольких областях? и эм.. как это должна учитывать запись? эм да, я пока совсем потерял нить объяснения...
0
|
6914 / 5979 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
|
|
19.06.2016, 15:00 | 15 |
Я же сказал - простые типы будут прямо в классе, а контейнеры STL, типа string и vector, используют динамическую память для хранения содержимого. Или если указатель будет в классе - прямой записью ты просто адрес сохранишь, а не содержимое.
Добавлено через 2 минуты У тебя 4 поля: 3 string и 1 float. Каждый string записываешь по образцу выше, и в конец дописываешь float. Чтение через vector или через массив.
1
|
0 / 0 / 1
Регистрация: 05.02.2014
Сообщений: 141
|
|
19.06.2016, 15:21 [ТС] | 16 |
0
|
Нарушитель
419 / 666 / 124
Регистрация: 10.08.2015
Сообщений: 2,937
|
|
19.06.2016, 18:42 | 17 |
В этой фразе уже три класса
1) товар 2) приемщик товара 3) склад 2) Принимает товар у поставщика, Проверяет товар на складе, Складирует товар на складе, Выдает товар со склада потребителю
0
|
19.06.2016, 18:42 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Создание статической функции класса, которая принимает экземпляр этого же класса как объект Создание объекта класса с полем являющимся объектом другого класса TIdNotify, создание и удаление объекта этого класса Инициализация объекта класса объектом этого же класса
Как вызвать метод класса в другом методе этого же класса? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |