Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/34: Рейтинг темы: голосов - 34, средняя оценка - 5.00
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614

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

01.11.2016, 22:32. Показов 6898. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.11.2016, 22:32
Ответы с готовыми решениями:

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

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

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

20
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
01.11.2016, 22:40
Что-то типо такого или я туплю?
C++
1
2
virtual Base* clone() const
        { return new Base( *this ); }
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
01.11.2016, 22:54  [ТС]
Конструктором копирования?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
01.11.2016, 23:19
Bretbas, как-то непонятно всё. Вот с самого начала:
Цитата Сообщение от Bretbas Посмотреть сообщение
Столкнулся с такой проблемой:
В чём она заключается? Хоть намёк.
Цитата Сообщение от Bretbas Посмотреть сообщение
Component - это просто данные, к примеру:
Тут Вы правы. Указатель PxRigidActor* _physicsActor;, это тоже данное. Но он на выделенную память смотрит? Или нет? То есть, не видно же что в этом классе клонируется.
И наконец фраза:
Цитата Сообщение от Bretbas Посмотреть сообщение
(тоесть создать новый объект, со всеми Новыми компонентами, но с теми же данными)
- отражает противоречие между поверхностным и глубоким копирование во всей полноте. Потому что Новыми компонентами и но с теми же данными, можно интерпретировать как угодно в ту или иную сторону. Если Вам нужен клон, то значит конструктор копии и оператор присваивания либо закрыты либо заняты своими делами, то есть не делают, то что Вам нужно в каком-то конкретном случае. Тогда создайте для этого случая статический метод:
C++
1
2
//клонирует для дождливой погоды в первой фазе луны:
public: static BTSComponentRigidBody cloneRainAndFmoon(const BTSComponentRigidBody & clone_me);

В этом случае тем не менее будет работать и конструктор копии.
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
02.11.2016, 10:23  [ТС]
IGPIGP,
Тут Вы правы. Указатель PxRigidActor* _physicsActor;, это тоже данное. Но он на выделенную память смотрит? Или нет? То есть, не видно же что в этом классе клонируется.
Вот именно, что из за этих данных - указателей, я не могу понять как правильно скопировать компонент. Причем этот указатель - объект другой библиотеки
0
Эксперт С++
 Аватар для Maxim Prishchepa
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
02.11.2016, 10:31
Конструктор копирования, ну и тут все зависит от того, какой метод копирования вы будете использовать, глубокое, ленивое и т.п. вариантов в принципе хватает.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
02.11.2016, 10:47
Цитата Сообщение от Bretbas Посмотреть сообщение
Вот именно, что из за этих данных - указателей, я не могу понять как правильно скопировать компонент. Причем этот указатель - объект другой библиотеки
Во-о-от... Пока Вы не поймёте куда смотрит данный указатель и как он может использоваться библиотечными объектами нельзя ничего и сказать. Значит моё недоумение, вызванное фразой:
Цитата Сообщение от Bretbas Посмотреть сообщение
это просто данные,
в противоречивом контексте:
Цитата Сообщение от Bretbas Посмотреть сообщение
создать новый объект, со всеми Новыми компонентами, но с теми же данными
более чем законно.
А насчёт указателя PxRigidActor* ванговать не стану. Скорее всего нужно выделить память и скопировать туда значение по данному указателю, что даже в случае, если объект этого указателя чист от подобных указателей - не имея конструктора объекта не получится. Без хаков.
Bretbas, постарайтесь переписать свой вопрос по-новому. Хотя бы для себя. Это должно помочь.
1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
05.11.2016, 23:40  [ТС]
IGPIGP,
А насчёт указателя PxRigidActor* ванговать не стану. Скорее всего нужно выделить память и скопировать туда значение по данному указателю, что даже в случае, если объект этого указателя чист от подобных указателей - не имея конструктора объекта не получится. Без хаков.
Так, хорошо, выделю я новую память под PxRigidActor, скопирую туда данные...но таких компонентов с аналогичными указателями на что то достаточно много, и мне нужно соответственно обобщенно копировать. Понимаете? Или придётся для каждого компонента свой конструктор копирования переопределять
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
06.11.2016, 00:41
Bretbas, жизнь полна противоречий. Вот фраза:
Цитата Сообщение от Bretbas Посмотреть сообщение
.но таких компонентов с аналогичными указателями на что то достаточно много, и мне нужно соответственно обобщенно копировать.
Первая часть отражает тяжкую необходимость:
Цитата Сообщение от Bretbas Посмотреть сообщение
.но таких компонентов с аналогичными указателями на что то достаточно много,
а вторая, - нежелание с нею мириться и решать проблему:
Цитата Сообщение от Bretbas Посмотреть сообщение
мне нужно соответственно обобщенно копировать.
Никто не мешает определить конструкторы копий, операторы присваивания, методы клонирования как вам угодно. Конструкторы копий или часть из них, как правило, в конечном счёте используются и в методах производящих экземпляры. Если это возможно лучше всего использовать их, потому, что они автоматизируют копирование, запуская конструкторы копий членов.
А с указателями надо разбираться. Вы кроме того, что указатель указывает на библиотечный класс ничего не сказали. Есть ли у этого класса открытый конструктор копии, например. Поэтому разговор не сдвигается с той точки в которой остановился.
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
06.11.2016, 01:16  [ТС]
IGPIGP,
. Вы кроме того, что указатель указывает на библиотечный класс ничего не сказали. Есть ли у этого класса открытый конструктор копии, например.
на данном этапе есть открытый конструктор копий, но компоненты могут в дальнейшем расширяться, и я уже не знаю, будет ли он открытый или нет.

Я лучше объясню, для чего мне это нужно, может подскажете что-нибудь:
Мне нужно сделать разные фабрики для объектов на уровне различных прототипов. Тоесть есть прототип объекта-снаряд. У него есть различные компоненты-ComponentMeshFilter,ComponentConvexColli der, ComponentRigidBody и тд. Пока что он не добавлен на сцену - формально его еще нет. Как только я к примеру нажимаю кнопку "стрелять", должен создаваться и добавляться на сцену объект на основе прототипа объекта-снаряд.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
06.11.2016, 01:46
Начнем сконца. Вот это не шутка мне кажется:
Цитата Сообщение от Bretbas Посмотреть сообщение
и я уже не знаю, будет ли он открытый или нет.
Расширять кто будет? И как? Путём наследования? Тогда от Вас и зависит закрывать его или нет.
Иначе этот вопрос рушит возможность ответить. Я во всяком случае не знаю как.
Далее:
Цитата Сообщение от Bretbas Посмотреть сообщение
на данном этапе есть открытый конструктор копий, но компоненты могут в дальнейшем расширяться
Если расширять наследованием то указателя на базовый класс Вам хватит. Но конструкторы придётся предоставить.
Цитата Сообщение от Bretbas Посмотреть сообщение
Мне нужно сделать разные фабрики для объектов на уровне различных прототипов. Тоесть есть прототип объекта-снаряд. У него есть различные компоненты-ComponentMeshFilter,ComponentConvexColli der, ComponentRigidBody и тд. Пока что он не добавлен на сцену - формально его еще нет. Как только я к примеру нажимаю кнопку "стрелять", должен создаваться и добавляться на сцену объект на основе прототипа объекта-снаряд.
Чем плох конструктор? Я понимаю что такое функция прототип. Шаблонный класс можно назвать прототипом тоже. Но что такое объект-прототип я не понимаю. Этому есть определение или это Ваша терминология?
зы если речь о скорости создания экземпляров, то можно выделять память массивами char [N*Sizeof(T)] а потом заселять placement new например, если Вы об этом. Я гадаю, потому как далековато от понимания Вашей задачи.
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
06.11.2016, 23:13  [ТС]
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
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
07.11.2016, 09:14
Bretbas,
Цитата Сообщение от Bretbas Посмотреть сообщение
так называемые "префабы"
и
Цитата Сообщение от Bretbas Посмотреть сообщение
выступает в роли
это литература. Не имея представления о Unit3D и её кухне могу лишь сказать в тех же литературных оборотах:
Так создайте
Цитата Сообщение от Bretbas Посмотреть сообщение
что то типо такого же
Вообще, конечно имеет смысл разобраться с жизненным циклом объекта. Без детального понимания того, как и когда создаётся и как и когда уничтожается объект, ничего не получится. Ну не стану же я в самом деле, играть в дознавлки с вопросами вроде: -"А что будет если добавить на сцену один и тот же объект дважды?" И т.п.
Это всё равно, что спросить, а не лучше ли обратиться с вопросом в разделе игростроения. Там небось, и подраздел D3D есть и мужики, которые на этом Unit'e не одну собаку съели. Трехмерную. Клонированную, конечно.
Иначе, боюсь, Вам в таком духе, придётся долго объяснять суть вопроса.
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
07.11.2016, 22:38  [ТС]
IGPIGP, е моё. Да я же уже вроде все объяснил. Мог вопрос и на gamedev'е задать, но задал здесь, какая разница? Вопрос общий. Нужно правильно склонировать объект. Unity3d я привёл как пример, можно его вообще не рассматривать. Какая разница какой жизненный цикл у объекта? Если Вам это нужно, то менеджер создаёт и разрушает объект. Тачкуется он по имени. Два объекта с одним и тем же именем на сцену поставить нельзя. По крайней мере я так сделал, и меня это устраивает. Теперь клоны клоны клоны:-) как?)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
07.11.2016, 22:52
Цитата Сообщение от Bretbas Посмотреть сообщение
Вопрос общий. Нужно правильно склонировать объект.
Вы не поняли того, что сказал Maxim Prishchepa. Посмотрите что он имел ввиду и поймите, что в общей постановке нет вопроса - как? Есть только to clone, or not to clone? То есть философия с большой толикой патетики. А остальное, - вполне конкретные вопросы.
Цитата Сообщение от Bretbas Посмотреть сообщение
Какая разница какой жизненный цикл у объекта? Если Вам это нужно, то менеджер создаёт и разрушает объект.
Тогда о чём мы говорим. Создавайте столько сколько Вам нужно и когда Вам нужно. Генерируйте пачку новых имён и, - вперёд. Что Вас смущает?
Эти объекты передаются только по ссылкам/указателям, кстати?
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
08.11.2016, 15:11  [ТС]
IGPIGP,
Эти объекты передаются только по ссылкам/указателям, кстати?
по ссылкам.
Тогда о чём мы говорим. Создавайте столько сколько Вам нужно и когда Вам нужно. Генерируйте пачку новых имён и, - вперёд. Что Вас смущает?
короче решил сделать так: просто буду создавать объекты из xml файлов, тоесть набиваю xml файл, примерный как должен выглядеть объект, и на этой почве создаю сколько угодно клонов
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.11.2016, 16:22
Цитата Сообщение от Bretbas Посмотреть сообщение
короче решил сделать так:
И слава богу. Вам же лучше знать как.
Как я понял, объект добавленный на сцену, может существовать долго и действовать долго. Я имею ввиду, что снаряд который один раз выпущен и взорван, можно не удалять, а управлять его видимостью. То есть, стрелять повторно. Если n выстрелов могут быть одновременными, то нужно n - одинаковых объектов. А снаряды для разных пушек (калибр, дальность, унитарность, оск/фуг и пр.) должны иметь разные модели прототипы (как Вы говорите). А уж как их создавать - вопрос жизненного цикла и Вашей стратегии. Противоречие тут, - диалектическое. Такое же, как при выборе, какой массив выбрать. Статический и глобальный, - быстро и расточительно. Динамические и локальные, - гибко, экономно, удобно. Но медленнее.
То есть, можно заранее заготовить весь арсенал оружия, а можно по мере надобности. От этого и будет зависеть ход дальнейших действий.
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
08.11.2016, 20:43  [ТС]
IGPIGP,
Как я понял, объект добавленный на сцену, может существовать долго и действовать долго.
Не всегда. В основном, но не всегда. Возьмем тот же снаряд. Мне нужна заготовка снаряда - Компонент - MeshRenderer, Компонент - Collider и тд. А также Компонент - RocketComponent, где я могу манипулировать данными, чтобы сделать это:
(калибр, дальность, унитарность, оск/фуг и пр.)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.11.2016, 21:04
Цитата Сообщение от Bretbas Посмотреть сообщение
Не всегда.
Посмотрите, что я написал. Я и имел ввиду, что не всегда. Я не знаю Вашей библиотеки, но предполагаю по тому что вижу, что она не дрожит от счастья при мысли о бесконтрольном добавлении объектов. Оно вроде всё заточено на многократное (по возможности) использование. И каждый новый объект-модель, связывается с владельцем уже механизмом своего создания. Может это кажется слишком абстрактным, но у меня нет информации чтобы сказать что-то более конкретное.
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
08.11.2016, 21:07  [ТС]
IGPIGP, даже если посудить, что объектов(пусть танков), которые могут стрелять этими снарядами будет много на сцене, и все они смогут стрелять одновременно и неоднократно, то я не вижу смысла держать в памяти лишние объекты, которых пока что нет, и может не быть
Я не знаю Вашей библиотеки
Библиотека моя Я пишу движок с Компонентной Системой Сущностей(ECS), для ученических целей
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.11.2016, 21:07
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru