Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проектирование класса. Несколько вопросов. 
:(
    Опции темы
Superklug
Дата 24.4.2010, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



Доброго времени суток!
По ходу реализации класса возник ряд вопросов. Надеюсь сможете помочь)

1. Наверно глупый вопрос, но как хранить массив байт? Допустим считал из потока N байт в массив char. Хранить *char и int? Хотелось бы чтобы была одна переменная.. Сделать свою структуру? Тогда наверно класс не очень удобен в использовании будет( Может можно использовать std::vector<char>? Если да, подскажите как лучше реализовать запись/чтение из потоков.

2. Вообще класс представляет собой что-то вроде Variant. Сейчас реализовано так: есть абстрактный класс Base, от него наследованы все возможные типы. Класс MyVariant содержит указатель на Base и методы вроде void asInt(int val) и int asInt().

Стоит ли объединить Base и MyVariant?

Существующая реализация позволяет писать так:
Код

MyVariant v(MyInt(100));

Как реализовать возможность использования такого кода:
Код

MyVariant v(100);   // т.е. по типу определяется есть ли подходящий конструктор для наследников Base
                     // и если да, создать именно этот объект


Вобщем нужно сделать использование класса как можно более удобным) Ситуация немного осложнена тем, что используются не только простые типы вроде int или string, но и массивы из MyVariant, и объекты - имя параметра и значение (std::map<std::string, MyVariant>) Т.е. возможны сложные конструкции вроде массив массивов...

3. Как можно реализовать копирование Base? Я добавил в Base виртуальную функцию Base* Clone(), которая реализована для каждого наследника. Не уверен, что это хорошее решение... Может можно как-то с помощью конструкторов сделать? 

4. На Delphi есть класс TDateTime. Есть ли какая-нибудь альтернатива на C++? Нужна минимальная функциональность, но хочется более стандартизованное решение, поэтому свой класс писать не хочу.

Может позже еще добавлю вопросы)

P.S. Заранее спасибо за ответы и за ваше терпение!
PM MAIL   Вверх
mes
Дата 24.4.2010, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



1. vector<char> или другой подходящий контейнер.. инфо по пользованию ими можно найти на сайте cplusplus.com 
2.  Вот простой пример объекта динамического типа с хранением данных в юнионе : http://codepad.org/4ysVHFtg dдля допиливания
3. для полиморфного копирования Clone, для простого конструктор копий.





Это сообщение отредактировал(а) mes - 24.4.2010, 00:39


--------------------
PM MAIL WWW   Вверх
jonie
Дата 24.4.2010, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Цитата

Тогда наверно класс не очень удобен в использовании будет( Может можно использовать std::vector<char>? Если да, подскажите как лучше реализовать запись/чтение из потоков.
угу, его  родного... а читать стандартно.. через например std::copy, все зависит от того что надо.

Цитата


4. На Delphi есть класс TDateTime. Есть ли какая-нибудь альтернатива на C++? Нужна минимальная функциональность, но хочется более стандартизованное решение, поэтому свой класс писать не хочу.
есть boost::date ...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Superklug
Дата 24.4.2010, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



mes, 
1. Т.е. использование vector - это нормальное решение? Хорошо)
2. Совсем простой вариант... У меня так не получится( Тут для каждого типа описана функция Set и switch для функции Get. Нельзя более гибко реализовать? У меня просто опыта работы с шаблонами немного((
3. Значит использования Clone - классическое решение? Рад, что сам додумался))

Добавлено через 5 минут и 37 секунд
Цитата(jonie @  24.4.2010,  00:40 Найти цитируемый пост)
есть boost::date ... 

Думал об этом.. Просто по большому счету нет разницы свой класс написать или использовать класс сторонней библиотеки)
PM MAIL   Вверх
mes
Дата 24.4.2010, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Superklug @  23.4.2010,  23:57 Найти цитируемый пост)
Совсем простой вариант... У меня так не получится

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

т.е. union может выглядить так
Код

union {
int         as_int;
long        as_long;
double      as_double;
void      * as_ptr;
ICloneble * as_object;
};

ну а так : http://www.boost.org/doc/libs/1_42_0/doc/html/variant.html

Цитата(Superklug @  23.4.2010,  23:17 Найти цитируемый пост)
Как реализовать возможность использования такого кода:

добавить нужный конструктор

4. http://www.codeproject.com/KB/datetime/datetimedisc.aspx


Это сообщение отредактировал(а) mes - 24.4.2010, 10:01


--------------------
PM MAIL WWW   Вверх
Superklug
Дата 24.4.2010, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



Цитата(mes @  24.4.2010,  09:59 Найти цитируемый пост)
ну а так : http://www.boost.org/doc/libs/1_42_0/doc/html/variant.html

Ну реализация Variant от буста мне нравится) Только я не смог в ней разобраться. Отчасти поэтому и обратился к вам...

Цитата(mes @  24.4.2010,  09:59 Найти цитируемый пост)
добавить нужный конструктор

Т.е. через шаблоны никак не получится? Если писать по функции на каждый тип, то будет много подобного кода. И добавление нового наследника от Base потребует дописания кучи методов..

Цитата(mes @  24.4.2010,  09:59 Найти цитируемый пост)
4. http://www.codeproject.com/KB/datetime/datetimedisc.aspx

Спасибо)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.