Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
Bretbas
Каждому свое
526 / 212 / 81
Регистрация: 05.08.2013
Сообщений: 1,612
Завершенные тесты: 2
1

Как произвести клонирование объекта со всеми его компонентами?

01.11.2016, 22:32. Просмотров 1645. Ответов 20
Метки нет (Все метки)

Добрый день, Уважаемые форумчане. Столкнулся с такой проблемой:
Есть объект Object, который содержит множество компонентов Component. Component - это просто данные, к примеру:
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
...
class BTSComponentRigidBody : public BTSRegisterComponent<BTSComponentRigidBody>
{
public:
    BTSComponentRigidBody( BTSObject* btsObject );
    ~BTSComponentRigidBody();
 
    void                setPhysicsActor( PxRigidActor* physicsActor );
    void                setTypeRigidBody( TypeRigidBody typeRigidBody );
    void                setMass( float mass );
    void                setLinearDrag( float linearDrag );
    void                setAngularDrag( float angularDrag );
 
    TypeRigidBody       getTypeRigidBody()  const;
    float               getMass()           const;
    float               getLinearDrag()     const;
    float               getAngularDrag()    const;
    PxRigidActor*       getPhysicsActor()   const;
    
    private:
        PxRigidActor*   _physicsActor;
        TypeRigidBody   _typeRigidBody;
        float           _mass;
        float           _linearDrag;
        float           _angularDrag;
};
...
Как мне можно правильно склонировать этот объект? Со всеми его компонентами? Именно склонировать(тоесть создать новый объект, со всеми Новыми компонентами, но с теми же данными)
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2016, 22:32
Ответы с готовыми решениями:

Как обновить фрейм со всеми его компонентами?
Пример. Есть окно на нем JComboBox в который помещаются компоненты из ArrayList. ArrayList ...

Клонирование объекта и помещение его на страницу с сохранением координат
Здравствуйте, кто нибудь будьте добры помогите решить следующую задачу: как обычную картинку...

Как сохранить содержимое IpHtmPanel со всеми компонентами?
Как сохранить содержимое IpHtmPanel cо всеми компонентами? Я загрузил .htm файл в IpHtmPanel,...

Как полностью удалить форму со всеми компонентами на ней и очистить память кодом
Как полностью удалить форму со всеми компонентами на ней и очистить память кодом.

Клонирование Windows 7 (со всеми программами) на разное железо
Прошу совета у бывалых! Вычитал, что можно клонировать систему и программы на компьютеры с...

20
Peoples
Эксперт С++
1423 / 892 / 773
Регистрация: 06.02.2016
Сообщений: 2,344
Записей в блоге: 19
Завершенные тесты: 5
01.11.2016, 22:40 2
Что-то типо такого или я туплю?
C++
1
2
virtual Base* clone() const
        { return new Base( *this ); }
0
Bretbas
Каждому свое
526 / 212 / 81
Регистрация: 05.08.2013
Сообщений: 1,612
Завершенные тесты: 2
01.11.2016, 22:54  [ТС] 3
Конструктором копирования?
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7661 / 3806 / 521
Регистрация: 04.12.2011
Сообщений: 11,005
Записей в блоге: 5
01.11.2016, 23:19 4
Bretbas, как-то непонятно всё. Вот с самого начала:
Цитата Сообщение от Bretbas Посмотреть сообщение
Столкнулся с такой проблемой:
В чём она заключается? Хоть намёк.
Цитата Сообщение от Bretbas Посмотреть сообщение
Component - это просто данные, к примеру:
Тут Вы правы. Указатель PxRigidActor* _physicsActor;, это тоже данное. Но он на выделенную память смотрит? Или нет? То есть, не видно же что в этом классе клонируется.
И наконец фраза:
Цитата Сообщение от Bretbas Посмотреть сообщение
(тоесть создать новый объект, со всеми Новыми компонентами, но с теми же данными)
- отражает противоречие между поверхностным и глубоким копирование во всей полноте. Потому что Новыми компонентами и но с теми же данными, можно интерпретировать как угодно в ту или иную сторону. Если Вам нужен клон, то значит конструктор копии и оператор присваивания либо закрыты либо заняты своими делами, то есть не делают, то что Вам нужно в каком-то конкретном случае. Тогда создайте для этого случая статический метод:
C++
1
2
//клонирует для дождливой погоды в первой фазе луны:
public: static BTSComponentRigidBody cloneRainAndFmoon(const BTSComponentRigidBody & clone_me);

В этом случае тем не менее будет работать и конструктор копии.
0
01.11.2016, 23:19
Bretbas
Каждому свое
526 / 212 / 81
Регистрация: 05.08.2013
Сообщений: 1,612
Завершенные тесты: 2
02.11.2016, 10:23  [ТС] 5
IGPIGP,
Тут Вы правы. Указатель PxRigidActor* _physicsActor;, это тоже данное. Но он на выделенную память смотрит? Или нет? То есть, не видно же что в этом классе клонируется.
Вот именно, что из за этих данных - указателей, я не могу понять как правильно скопировать компонент. Причем этот указатель - объект другой библиотеки
0
Maxim Prishchepa
Эксперт С++
1927 / 1039 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
02.11.2016, 10:31 6
Конструктор копирования, ну и тут все зависит от того, какой метод копирования вы будете использовать, глубокое, ленивое и т.п. вариантов в принципе хватает.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7661 / 3806 / 521
Регистрация: 04.12.2011
Сообщений: 11,005
Записей в блоге: 5
02.11.2016, 10:47 7
Цитата Сообщение от Bretbas Посмотреть сообщение
Вот именно, что из за этих данных - указателей, я не могу понять как правильно скопировать компонент. Причем этот указатель - объект другой библиотеки
Во-о-от... Пока Вы не поймёте куда смотрит данный указатель и как он может использоваться библиотечными объектами нельзя ничего и сказать. Значит моё недоумение, вызванное фразой:
Цитата Сообщение от Bretbas Посмотреть сообщение
это просто данные,
в противоречивом контексте:
Цитата Сообщение от Bretbas Посмотреть сообщение
создать новый объект, со всеми Новыми компонентами, но с теми же данными
более чем законно.
А насчёт указателя PxRigidActor* ванговать не стану. Скорее всего нужно выделить память и скопировать туда значение по данному указателю, что даже в случае, если объект этого указателя чист от подобных указателей - не имея конструктора объекта не получится. Без хаков.
Bretbas, постарайтесь переписать свой вопрос по-новому. Хотя бы для себя. Это должно помочь.
1
Bretbas
Каждому свое
526 / 212 / 81
Регистрация: 05.08.2013
Сообщений: 1,612
Завершенные тесты: 2
05.11.2016, 23:40  [ТС] 8
IGPIGP,
А насчёт указателя PxRigidActor* ванговать не стану. Скорее всего нужно выделить память и скопировать туда значение по данному указателю, что даже в случае, если объект этого указателя чист от подобных указателей - не имея конструктора объекта не получится. Без хаков.
Так, хорошо, выделю я новую память под PxRigidActor, скопирую туда данные...но таких компонентов с аналогичными указателями на что то достаточно много, и мне нужно соответственно обобщенно копировать. Понимаете? Или придётся для каждого компонента свой конструктор копирования переопределять
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7661 / 3806 / 521
Регистрация: 04.12.2011
Сообщений: 11,005
Записей в блоге: 5
06.11.2016, 00:41 9
Bretbas, жизнь полна противоречий. Вот фраза:
Цитата Сообщение от Bretbas Посмотреть сообщение
.но таких компонентов с аналогичными указателями на что то достаточно много, и мне нужно соответственно обобщенно копировать.
Первая часть отражает тяжкую необходимость:
Цитата Сообщение от Bretbas Посмотреть сообщение
.но таких компонентов с аналогичными указателями на что то достаточно много,
а вторая, - нежелание с нею мириться и решать проблему:
Цитата Сообщение от Bretbas Посмотреть сообщение
мне нужно соответственно обобщенно копировать.
Никто не мешает определить конструкторы копий, операторы присваивания, методы клонирования как вам угодно. Конструкторы копий или часть из них, как правило, в конечном счёте используются и в методах производящих экземпляры. Если это возможно лучше всего использовать их, потому, что они автоматизируют копирование, запуская конструкторы копий членов.
А с указателями надо разбираться. Вы кроме того, что указатель указывает на библиотечный класс ничего не сказали. Есть ли у этого класса открытый конструктор копии, например. Поэтому разговор не сдвигается с той точки в которой остановился.
0
Bretbas
Каждому свое
526 / 212 / 81
Регистрация: 05.08.2013
Сообщений: 1,612
Завершенные тесты: 2
06.11.2016, 01:16  [ТС] 10
IGPIGP,
. Вы кроме того, что указатель указывает на библиотечный класс ничего не сказали. Есть ли у этого класса открытый конструктор копии, например.
на данном этапе есть открытый конструктор копий, но компоненты могут в дальнейшем расширяться, и я уже не знаю, будет ли он открытый или нет.

Я лучше объясню, для чего мне это нужно, может подскажете что-нибудь:
Мне нужно сделать разные фабрики для объектов на уровне различных прототипов. Тоесть есть прототип объекта-снаряд. У него есть различные компоненты-ComponentMeshFilter,ComponentConvexCollider, ComponentRigidBody и тд. Пока что он не добавлен на сцену - формально его еще нет. Как только я к примеру нажимаю кнопку "стрелять", должен создаваться и добавляться на сцену объект на основе прототипа объекта-снаряд.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7661 / 3806 / 521
Регистрация: 04.12.2011
Сообщений: 11,005
Записей в блоге: 5
06.11.2016, 01:46 11
Начнем сконца. Вот это не шутка мне кажется:
Цитата Сообщение от Bretbas Посмотреть сообщение
и я уже не знаю, будет ли он открытый или нет.
Расширять кто будет? И как? Путём наследования? Тогда от Вас и зависит закрывать его или нет.
Иначе этот вопрос рушит возможность ответить. Я во всяком случае не знаю как.
Далее:
Цитата Сообщение от Bretbas Посмотреть сообщение
на данном этапе есть открытый конструктор копий, но компоненты могут в дальнейшем расширяться
Если расширять наследованием то указателя на базовый класс Вам хватит. Но конструкторы придётся предоставить.
Цитата Сообщение от Bretbas Посмотреть сообщение
Мне нужно сделать разные фабрики для объектов на уровне различных прототипов. Тоесть есть прототип объекта-снаряд. У него есть различные компоненты-ComponentMeshFilter,ComponentConvexCollider, ComponentRigidBody и тд. Пока что он не добавлен на сцену - формально его еще нет. Как только я к примеру нажимаю кнопку "стрелять", должен создаваться и добавляться на сцену объект на основе прототипа объекта-снаряд.
Чем плох конструктор? Я понимаю что такое функция прототип. Шаблонный класс можно назвать прототипом тоже. Но что такое объект-прототип я не понимаю. Этому есть определение или это Ваша терминология?
зы если речь о скорости создания экземпляров, то можно выделять память массивами char [N*Sizeof(T)] а потом заселять placement new например, если Вы об этом. Я гадаю, потому как далековато от понимания Вашей задачи.
0
Bretbas
Каждому свое
526 / 212 / 81
Регистрация: 05.08.2013
Сообщений: 1,612
Завершенные тесты: 2
06.11.2016, 23:13  [ТС] 12
IGPIGP, В игровом движке Unity3D есть так называемые "префабы". Префаб выступает в роли шаблона для создания экземпляров хранимого объекта в сцене. Вот мне нужно создать что то типо такого же. Чтобы я мог организовать игровой объект, а потом по мере необходимости мог создавать экземпляры(клоны) этого объекта и помещать их на сцену.
Что то типо такого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
...
auto object = managerObject -> addObject( "Rocket" );
{
    auto componentMesh = object -> addComponent<ComponentMesh>();
    componentMesh -> setMesh( Assets :: getCubeMesh() );
 
   auto componentRigidBody = object -> addComponent<ComponentRigidBody>();
    componentRigidBody -> setMass( 10.0f );
 
    // Добавляем ещё компонентов
}
...
А потом при необходимости получать новые экземпляры этого объекта, заранее организованного:
C++
1
2
3
4
5
...
    scene -> addObject( managerObject -> getInstance( "Rocket" ) );
    // работаю с этим объектом, и если нужно удаляются его со сцены
    scene -> removeObject( "Rocket" );
...
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7661 / 3806 / 521
Регистрация: 04.12.2011
Сообщений: 11,005
Записей в блоге: 5
07.11.2016, 09:14 13
Bretbas,
Цитата Сообщение от Bretbas Посмотреть сообщение
так называемые "префабы"
и
Цитата Сообщение от Bretbas Посмотреть сообщение
выступает в роли
это литература. Не имея представления о Unit3D и её кухне могу лишь сказать в тех же литературных оборотах:
Так создайте
Цитата Сообщение от Bretbas Посмотреть сообщение
что то типо такого же
Вообще, конечно имеет смысл разобраться с жизненным циклом объекта. Без детального понимания того, как и когда создаётся и как и когда уничтожается объект, ничего не получится. Ну не стану же я в самом деле, играть в дознавлки с вопросами вроде: -"А что будет если добавить на сцену один и тот же объект дважды?" И т.п.
Это всё равно, что спросить, а не лучше ли обратиться с вопросом в разделе игростроения. Там небось, и подраздел D3D есть и мужики, которые на этом Unit'e не одну собаку съели. Трехмерную. Клонированную, конечно.
Иначе, боюсь, Вам в таком духе, придётся долго объяснять суть вопроса.
0
Bretbas
Каждому свое
526 / 212 / 81
Регистрация: 05.08.2013
Сообщений: 1,612
Завершенные тесты: 2
07.11.2016, 22:38  [ТС] 14
IGPIGP, е моё. Да я же уже вроде все объяснил. Мог вопрос и на gamedev'е задать, но задал здесь, какая разница? Вопрос общий. Нужно правильно склонировать объект. Unity3d я привёл как пример, можно его вообще не рассматривать. Какая разница какой жизненный цикл у объекта? Если Вам это нужно, то менеджер создаёт и разрушает объект. Тачкуется он по имени. Два объекта с одним и тем же именем на сцену поставить нельзя. По крайней мере я так сделал, и меня это устраивает. Теперь клоны клоны клоны:-) как?)
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7661 / 3806 / 521
Регистрация: 04.12.2011
Сообщений: 11,005
Записей в блоге: 5
07.11.2016, 22:52 15
Цитата Сообщение от Bretbas Посмотреть сообщение
Вопрос общий. Нужно правильно склонировать объект.
Вы не поняли того, что сказал Maxim Prishchepa. Посмотрите что он имел ввиду и поймите, что в общей постановке нет вопроса - как? Есть только to clone, or not to clone? То есть философия с большой толикой патетики. А остальное, - вполне конкретные вопросы.
Цитата Сообщение от Bretbas Посмотреть сообщение
Какая разница какой жизненный цикл у объекта? Если Вам это нужно, то менеджер создаёт и разрушает объект.
Тогда о чём мы говорим. Создавайте столько сколько Вам нужно и когда Вам нужно. Генерируйте пачку новых имён и, - вперёд. Что Вас смущает?
Эти объекты передаются только по ссылкам/указателям, кстати?
0
Bretbas
Каждому свое
526 / 212 / 81
Регистрация: 05.08.2013
Сообщений: 1,612
Завершенные тесты: 2
08.11.2016, 15:11  [ТС] 16
IGPIGP,
Эти объекты передаются только по ссылкам/указателям, кстати?
по ссылкам.
Тогда о чём мы говорим. Создавайте столько сколько Вам нужно и когда Вам нужно. Генерируйте пачку новых имён и, - вперёд. Что Вас смущает?
короче решил сделать так: просто буду создавать объекты из xml файлов, тоесть набиваю xml файл, примерный как должен выглядеть объект, и на этой почве создаю сколько угодно клонов
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7661 / 3806 / 521
Регистрация: 04.12.2011
Сообщений: 11,005
Записей в блоге: 5
08.11.2016, 16:22 17
Цитата Сообщение от Bretbas Посмотреть сообщение
короче решил сделать так:
И слава богу. Вам же лучше знать как.
Как я понял, объект добавленный на сцену, может существовать долго и действовать долго. Я имею ввиду, что снаряд который один раз выпущен и взорван, можно не удалять, а управлять его видимостью. То есть, стрелять повторно. Если n выстрелов могут быть одновременными, то нужно n - одинаковых объектов. А снаряды для разных пушек (калибр, дальность, унитарность, оск/фуг и пр.) должны иметь разные модели прототипы (как Вы говорите). А уж как их создавать - вопрос жизненного цикла и Вашей стратегии. Противоречие тут, - диалектическое. Такое же, как при выборе, какой массив выбрать. Статический и глобальный, - быстро и расточительно. Динамические и локальные, - гибко, экономно, удобно. Но медленнее.
То есть, можно заранее заготовить весь арсенал оружия, а можно по мере надобности. От этого и будет зависеть ход дальнейших действий.
0
Bretbas
Каждому свое
526 / 212 / 81
Регистрация: 05.08.2013
Сообщений: 1,612
Завершенные тесты: 2
08.11.2016, 20:43  [ТС] 18
IGPIGP,
Как я понял, объект добавленный на сцену, может существовать долго и действовать долго.
Не всегда. В основном, но не всегда. Возьмем тот же снаряд. Мне нужна заготовка снаряда - Компонент - MeshRenderer, Компонент - Collider и тд. А также Компонент - RocketComponent, где я могу манипулировать данными, чтобы сделать это:
(калибр, дальность, унитарность, оск/фуг и пр.)
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7661 / 3806 / 521
Регистрация: 04.12.2011
Сообщений: 11,005
Записей в блоге: 5
08.11.2016, 21:04 19
Цитата Сообщение от Bretbas Посмотреть сообщение
Не всегда.
Посмотрите, что я написал. Я и имел ввиду, что не всегда. Я не знаю Вашей библиотеки, но предполагаю по тому что вижу, что она не дрожит от счастья при мысли о бесконтрольном добавлении объектов. Оно вроде всё заточено на многократное (по возможности) использование. И каждый новый объект-модель, связывается с владельцем уже механизмом своего создания. Может это кажется слишком абстрактным, но у меня нет информации чтобы сказать что-то более конкретное.
0
Bretbas
Каждому свое
526 / 212 / 81
Регистрация: 05.08.2013
Сообщений: 1,612
Завершенные тесты: 2
08.11.2016, 21:07  [ТС] 20
IGPIGP, даже если посудить, что объектов(пусть танков), которые могут стрелять этими снарядами будет много на сцене, и все они смогут стрелять одновременно и неоднократно, то я не вижу смысла держать в памяти лишние объекты, которых пока что нет, и может не быть
Я не знаю Вашей библиотеки
Библиотека моя Я пишу движок с Компонентной Системой Сущностей(ECS), для ученических целей
0
08.11.2016, 21:07
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2016, 21:07

Копия формы со всеми компонентами
Здравствуйте! Подскажите пожалуйста: У меня есть созданная форма1 с разными компонентами на...

Копия формы со всеми компонентами и кодом
Столкнулся с такой проблемой...Есть подключенная бд, в ней 9 таблиц. Нужно скопировать форму со...

Клонирование объекта
По заданному интерфейсу пишу класс вектора стандартного. Не проходят тесты для метода clone ()....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.