Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648

Создание копии экземпляра класса

22.02.2019, 21:47. Показов 3492. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравствуйте.

Нужно создать копию экземпляра класса. Делаю это простым копированием элементов одного экземпляра класса в элементы другого:
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
class TExample
{
private:
public:
    TExample()
    {
        n = 0;
        s = "";
    }
    int n;
    SmallString<4> s;
};
 
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
    // Начальная инициализация экземпляра класса exaple1
    TExample *ex1 = new TExample;
    ex1->n = 111;
    ex1->s = "asdf";
 
    // Создаём точную копию экземпляра класса ex1
    TExample *ex2 = new TExample;
    ex2->n = ex1->n;
    ex2->s = ex1->s;
}
Существует ли другой более лаконичный способ выполнить данную задачу?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.02.2019, 21:47
Ответы с готовыми решениями:

Создание экземпляра класса
Может кто-то подсказать как правильно создать экземпляр класса TFDConnect в потоке (TThread). Я просто понятия не имею что нужно...

Ошибка при использовании экземпляра класса
Всем здравствуйте. Есть класс, суть которого - одна функция записывающая массив вещественных значений в файл с определённым именем (один...

Создание копии массива
Всем здравствуйте. Нужно сделать копию массива. Размер массива известен. int a = {1,2,3,4,5,6,7,8,9,10}; // копируемый массив ...

10
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
22.02.2019, 21:58
Цитата Сообщение от jkrnd Посмотреть сообщение
Существует ли другой более лаконичный способ выполнить данную задачу?
Вместо
Цитата Сообщение от jkrnd Посмотреть сообщение
C++
1
2
ex2->n = ex1->n;
ex2->s = ex1->s;
можно написать
C++
1
*ex2 = *ex1;
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
22.02.2019, 22:07  [ТС]
nonedark2008, в этом случае ex2 и ex1 останутся абсолютно не зависимыми друг от друга (для каждого из них отведена своя память)?
Другими словами если я поменяю значение члена одного экземпляра, например ex1->n = 5, не поменяется ли оно автоматически и в копии (не станет ли автоматически ex2->n равным 5)?
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
22.02.2019, 22:12
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

Цитата Сообщение от jkrnd Посмотреть сообщение
в этом случае ex2 и ex1 останутся абсолютно не зависимыми друг от друга (для каждого из них отведена своя память)?
Если у SmallString<4> есть корректно определенный оператор присваивания, то да.
Оператор присваивания по-умолчанию (он автоматически создается, если у тебя в классе не определен свой operator =) обычно и делает то, что ты проделал вручную: поэлементно присваивает каждый элемент объекта.
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33393 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
23.02.2019, 00:23
jkrnd, а воспользоваться конструктором копирования, который автоматически генерируется компилятором:
C++
1
    TExample *ex2 = new TExample(*ex1);
никак нельзя?
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
23.02.2019, 06:32  [ТС]
volvo, nonedark2008, а если у меня массив классов и я хочу создать его независимую копию. Массив при этом объявляется в области глобальных переменных:
C++
1
2
TExample *examp1 = new TExample[5];
TExample *examp2 = new TExample[5];
и далее
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    // Создать копию массивов класса
    // Начальная инициализация одного из членов массива экземпляров класса examp1
    examp1[3].n = 999;
    examp1[3].s = "zxcv";
    // Скопировать весь массив классов examp1 в массив классов examp2
    Label1->Caption = "examp1[3].n = " + IntToStr(examp1[3].n);
    Label2->Caption = "examp1[3].s = " + examp1[3].s;
 
    Label3->Caption = "examp2[3].n = " + IntToStr(examp2[3].n);
    Label4->Caption = "examp2[3].s = " + examp2[3].s;
}
Добавлено через 5 минут
попробовал так
C++
1
examp2 = examp1;
получилось, но не уверен что это грамотно и правильно.
И ещё. Как бы избавиться от точек и работать с элементами классов только по ссылкам (->)?
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
23.02.2019, 10:55
Цитата Сообщение от jkrnd Посмотреть сообщение
попробовал так
Так ты просто скопируешь значение указателя. А тебе нужно скопировать элементы, на которые он указывает.

Я бы сделал вот так:
C++
1
2
3
#include <algorithm>
//...
std::copy_n(examp1, 5, examp2);
А вообще, вместо массива лучше использовать контейнер по типу std::vector. Тогда бы и examp1 = examp2 работало как надо.

Добавлено через 5 минут
Цитата Сообщение от jkrnd Посмотреть сообщение
Как бы избавиться от точек и работать с элементами классов только по ссылкам (->)?
Не знаю зачем тебе это, но в классе TExample ты можешь перегрузить оператор ->. Я бы так делать не советовал, но в качестве примера:
C++
1
2
3
TExample* operator ->() {
    return this;
}
Ну или просто везде храни указатели на объекты своего класса.
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
23.02.2019, 11:33  [ТС]
Цитата Сообщение от nonedark2008 Посмотреть сообщение
зачем тебе это
из опасения, чтобы не тормозить программу. Ведь известно, что при передаче значения параметра по ссылке всё происходит быстрее, так как не создаётся копия передаваемого.
Цитата Сообщение от nonedark2008 Посмотреть сообщение
использовать контейнер по типу std::vector
если можно, пример пожалуйста через вектор.
Всё отлично работает. Просто и лаконично. Спасибо.

Не по теме:

реальный массив классов довольно большой и содержит в себе подмассив других классов, так что вы мне сэкономили почти страницу A4 кода :)

0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
23.02.2019, 11:55
Цитата Сообщение от jkrnd Посмотреть сообщение
Ведь известно, что при передаче значения параметра по ссылке
Эмм, да, но в одном ты заблуждаешься: -> не имеет никакого отношения к ссылкам и передаче параметров по ссылке, это просто оператор разыменования указателя.

Добавлено через 5 минут
Цитата Сообщение от jkrnd Посмотреть сообщение
если можно, пример пожалуйста через вектор.
Вектор на 5 элементов, работать с ним можно почти как с массивом:
C++
1
std::vector<TExample> examp1(5);
Но я про Builder ничего не знаю, возможно там есть свои контейнеры... Советую прочитать документацию по всему, что ты хочешь использовать. Большинство вопросов сразу отпадет.
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
23.02.2019, 12:10  [ТС]
nonedark2008,
так?
C++
1
2
3
    std::vector<TExample> examp1(5);        // #include <vector>
    std::vector<TExample> examp2(5);
    examp2 = examp1;
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
23.02.2019, 12:25
Цитата Сообщение от jkrnd Посмотреть сообщение
так?
ага
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.02.2019, 12:25
Помогаю со студенческими работами здесь

Удаление компонента и последующее создание его копии
То есть компонент исчезает с лица формы с помощью функции delete(CutegoryButtons), а потом нужно создать точно такой же category buttons с...

Создание новой копии компонента при нажатии Enter
Помогите Как можно при помощи нажатия Enter или любую клавишу можно создать повторно такой же компонент(ComboBox или Edit)? при void...

Создание резервной копии БД
В другой программе работал код. Может я что-то забыл... if (SaveDialog1-&gt;Execute()) { CopyFile(L&quot;MoveEngine.mdb&quot;,...

Создание резервной копии БД
Привет, помогите плз сделать резервную копию БД в ADOQuery

Создание нового экземпляра дочернего класса из экземпляра базового
Всем привет! Извиняюсь, если вопрос глупый, но что-то не смог найти конкретный ответ на него... У меня есть несколько классов: все они...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru