Russian Qt Forum
Ноябрь 23, 2024, 20:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Как создать класс с "меняющейся начинкой" ?  (Прочитано 19281 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« : Январь 19, 2009, 11:56 »

Доброго дня!


к примеру есть некий объект, но в зависимости от его типа нужно соосветственно по разному создавать его "внутренности"

например в одном случае в зависимости от типа объекта (ObjType) надо иметь:
Код:
class MyObj
{
public:
 MyObj(int type);
 int getType();
 int getValue(); //т.е результат - целое
 void setType(int type);
 void setValue(int value); //т.е параметр - целое
private:
 int ObjType;
 int ObjValue; // т.е. значение - целое
}
но в другом случае в зависимости от типа объекта (ObjType) надо иметь:
Код:
class MyObj
{
public:
 MyObj(int type);
 int getType();
 bool getValue(); //т.е результат - булев
 void setType(int type);
 void setValue(bool value); //т.е параметр - булев
private:
 int ObjType;
 bool ObjValue; // т.е. значение - булево
}
т.е как мне объеденить все это в одном классе, но чтобы в зависимости от переменной type в конструкторе,
класс создавался с переменной value - целой или булевой?

Записан

ArchLinux x86_64 / Win10 64 bit
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Январь 19, 2009, 12:00 »

Ну этот вопрос к Qt не относится. Это по части С++...

По теме.. Возмите книгу по С++ и почитайте про шаблоны
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Январь 19, 2009, 12:35 »

да некада Улыбающийся мне б побыстрее б
Записан

ArchLinux x86_64 / Win10 64 bit
Rcus
Гость
« Ответ #3 : Январь 19, 2009, 12:41 »

Это и есть побыстрее Улыбающийся Хотите медленнее возьмите Boost::Any /*giggles*/
//а если отвлеченно интерпритировать постановку то возможно вам нужен QVariant
« Последнее редактирование: Январь 19, 2009, 12:48 от Rcus » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #4 : Январь 19, 2009, 13:08 »

насчет QVariant - это так получится?  :

*.h
Код:
class MyObj
{
public:
 MyObj(int type);
 int getType();
 QVariant getValue(); //
 void setValue(QVariant value); //
private:
 int ObjType;
 QVariant objValue; //
}


*.cpp
Код:
MyOBj::MyObj(int type)
{
 ObjType = type;
}

QVariant MyOBj::getValue()
{
 if (type==1) then return objValue.toInt;
 if (type==2) then return objValue.toBool;
}

QVariant MyOBj::setValue(QVariant value)
{
 ObjType = value;
}



Записан

ArchLinux x86_64 / Win10 64 bit
Rcus
Гость
« Ответ #5 : Январь 19, 2009, 13:13 »

нет, в QVariant это уже есть Улыбающийся
/*@see QVariant::type(), QVariant::value<T>()*/
« Последнее редактирование: Январь 19, 2009, 13:15 от Rcus » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #6 : Январь 19, 2009, 13:15 »

т.е вместо:
Код:
QVariant MyOBj::getValue()
{
 if (type==1) then return objValue.toInt;
 if (type==2) then return objValue.toBool;
}

писать:
Код:
QVariant MyOBj::getValue()
{
 return objValue;
}

??
Записан

ArchLinux x86_64 / Win10 64 bit
Rcus
Гость
« Ответ #7 : Январь 19, 2009, 13:17 »

Давайте мы не будем заниматься упражнениями в стиле Foo-Bar. Скажите какую прикладную задачу вы хотите решить и возможно ответ будет найти проще
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #8 : Январь 19, 2009, 13:30 »

Цитировать
Давайте мы не будем заниматься упражнениями в стиле Foo-Bar. Скажите какую прикладную задачу вы хотите решить и возможно ответ будет найти проще

вообщето в первом посте моем вроде как задача обрисована...

т.е имеется некий класс "регистр" (class Registr) в зависимости от его типа (например тип 1 или тип 2) значение этого регистра может
быть или bool или int ...

т.е чтобы не создавать два класса class Registr1 и class Registr2 нужно как-то сделать все в одном, и чтобы при указании в конструкторе класса типа 1 или типа 2  Registr::Registr(Register Type) происходил анализ этой переменной "Register Type" и в соответствии с ней определенным образом создавались "кишки" класса.. в частности переменная Value и ф-ции, с помощью которых можно ее прочитать и записать!

т.е если задан тип 1 - то переменная Value должна создаться типа int , и соответственно ф-я getValue должна возвратить тип int, а ф-я SetValue(Value) должна принимать параметр типа int  ...

в случае типа 2 - соответственно все bool должно быть
« Последнее редактирование: Январь 19, 2009, 13:35 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Dendy
Гость
« Ответ #9 : Январь 19, 2009, 13:46 »

В данном случае лучше не писать свой велосипед вообще, а использовать вместо него непосредственно QVariant.
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #10 : Январь 19, 2009, 13:57 »

template <typename T> class MyObj?
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #11 : Январь 19, 2009, 14:00 »

да некада Улыбающийся мне б побыстрее б
В любой спешке виноваты блохи.
Либо они на теле, либо в голове...
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #12 : Январь 19, 2009, 14:01 »

Цитировать
В данном случае лучше не писать свой велосипед вообще, а использовать вместо него непосредственно QVariant.

т.е

Код:
QVariant Registr::getValue()
{
 return RegValue;
}

Код:
void Registr::setValue(QVariant Value)
{
 RegValue = Value;
}

а сам RegValue  объявить как QVariant Непонимающий?
Записан

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #13 : Январь 19, 2009, 14:04 »

Цитировать
В любой спешке виноваты блохи.
Либо они на теле, либо в голове...

сие высказывание не несет полезной инфы! увы!
Записан

ArchLinux x86_64 / Win10 64 bit
Rcus
Гость
« Ответ #14 : Январь 19, 2009, 14:12 »

Но все же классы контейнеров являются не самоцелью, а частью решения. Например что межает заменить класс Registr на QVariant?
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.122 секунд. Запросов: 23.