Хитрая хитрость
итак, задача:
есть несколько классов. допустим, class human { int x,y,z, height, width; }; class car { int x,y,z,speed; }; нам нужно задавать внутренние значения для разных объектов разных классов, но имея лишь условный номер значения в объекте класса и само значение. для примера я сделал что все значения всех классов - int. т.е. пример условия: 2, 40 где 2 - номер значения (Y для обоих классов), а 40 - само значение, т.е. будь объект хоть car хоть human, в нём Y выставится в 40. я предположил что надо сделать массив, имеющийся в объекте каждого класса который содержит указатели на все значения (блин ну field'ы короче если говорить по блицевски) мы сами суём в него указатели на филды при создании объекта в конструкторе класса. в общем, не мог бы кто реализовать такой пример, чтоб в результате это можно было уместить в одну функцию типа SetValue(num,value) для этих двух классов которые я привёл? я довольно запутался... помню что если класс находится в иерархии другого класса, то мы можем из объектов дочерних классов получать объекты класса родителя, т.е. универсальные, это вроде ещё полиморфизм зовётся. думаю этот массив должен быть как раз в родительском... |
Ответ: Хитрая хитрость
эх
Код:
class position ps. я делал бы так Код:
class CVector3d |
Ответ: Хитрая хитрость
Цитата:
Код:
class Car; |
Ответ: Хитрая хитрость
Genius
Цитата:
я за такое тебя бы уволил бы без разбирательств ;) |
Ответ: Хитрая хитрость
Цитата:
З.Ы. Я не говорю что твой код дерьмо,я вырозил своё мнение. |
Ответ: Хитрая хитрость
Цитата:
говнокод тоже не хочется Гениус чето совсем не по теме вроде. посоветовали мне тут уже два человека юзать Vector. запихну его в родительский класс и попробую) |
Ответ: Хитрая хитрость
Genius
о static_cast слышал ? если уж у тебя так получилось (кривая архитектура или что-то еще) то можно и dynamic_cast использовать Mr_F_ просто представь что у тебя нету понятия индекс переменной, компилятор переменную которая у тебя написана второй может сделать первой или третей программируй так чтобы тебе индекс переменной был не нужен |
Вложений: 1
Вот ещё немного расширил:
Код:
class Car; Цитата:
А вообще тогда бы было что-то типа void Car::setPosition(const Vector& pos) { position = pos; бла бла бла,ставим тело в позицию... А вообще невижу смысла сохранять позицию так как есть же фунекции типа xPositionEntity,pxBodyPosition,xEntityX,pxBodyPosi tionX,etc. } Вот те многофункциональный 3D Вектор :) |
Ответ: Хитрая хитрость
В серьёз не воспринемай =), да и пожалуй так не делай )))
Код:
struct XYZ{ float x,y,z;}; |
Ответ: Хитрая хитрость
Извuниете что я тут со своим мылом. у меня вопрос к Гениус)
нах так писать? Код:
class A я конечно нубокодер) но мне кажется на худой конец можно просто в родителя добавить переменную тип а у детей типы разные писать ) |
Ответ: Хитрая хитрость
Цитата:
Я не говорю что это униврсальный способ,и для игры где претпологается динамическое добавления новых типов игровых объектов,через скрипт,ini,и т.д он точно не подходит,а вот если все игровые объекты буду описаны кодом то это вполне удобное решение. |
Ответ: Хитрая хитрость
Цитата:
Цитата:
ща объясню зачем всё надо) у меня есть свой формат файла (левел). раньше он состоял из готовых блоков с четко заданой последовательностю и структурой. но потом я стал запариваться, когда нужно было ввести какой то новый параметр в один из видов объектов, или вообще новый вид объекта. старый загрузчик сбивался и грузил черти что, надо было аккуратно менять сначала только сохранение, потом пересохранять все имеющиеся карты, затем менять лоад и тогда только радоваться). я решил сделать формат файла как бы параметр-driven. аналогичное наблюдается в формате FBX. структура такова: объект { номер значения значение } "номер значения-значение" конечно может быть много, до 255. их структура выглядит так: B номер значения B тип данных сами данные (B - байт, тип данных от 1 до 5, соотв от байта до стринга). а заголовок "объекта" представляет собой: B тип объекта (номер класса, тут проверяем просто ифом, их немного) L кол-во впереди идущих параметров со значениями и в общем вот. я согласен конечно вручную указывать какой ячейке массива какое значение в объекте класса принадлежит, другое дело что я банально запутался во всей этой хитрости с кучей указателей на указатели и полиморфизмом) вышеуказанный стиль формата файла имхо может весьма сократить расход нервов и сделать вполне совместимыми файлы разных версий (не хватает инфы? игнорим!) |
Ответ: Хитрая хитрость
Ёпть так надо было сразу с этого начинать...
Я бы так делал: Мы уже имеем объекты: представим что у нас в объекте есть массив так называемых Value,Value имеет 2 переменые 1) int,индификатор типа данных которые содержатся в Value и данные void*, Код:
struct Value Еесли будет не понятно могу и пример загрузки этого чуда написать.. |
Ответ: Хитрая хитрость
спасибо всем!
вроде тут сам успел допереть как то) сделал так: родительский класс: Код:
class access Код:
class material:public access{ (биндим к массиву содержимое объекта класса)) Код:
material::material() Код:
access *Temp; |
Ответ: Хитрая хитрость
Mr_F_
я сделал проще немного, у меня в файле содержится имя переменной и её значение в программе где нужно я просто получаю значение по имени таким образом если переменной не было то вернётся default значение :) |
Часовой пояс GMT +4, время: 12:10. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot