Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как копировать объект?

2.1K
19 октября 2004 года
bleed
22 / / 05.07.2003
Подскажите как сделать сабж.

Есть к примеру класс:
myClass
{
public:
int Value;
};

в программе создаю объект:
myClass * ptr = new myClass;
ptr->Value=10;

myClass * ptr2 = new myClass;
как скопировать ptr в ptr2,
т.е получить тотже результат что дает метод Assign()?

За ранее спасибо.
3
19 октября 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by bleed
Подскажите как сделать сабж.

Есть к примеру класс:
myClass
{
public:
int Value;
};

в программе создаю объект:
myClass * ptr = new myClass;
ptr->Value=10;

myClass * ptr2 = new myClass;
как скопировать ptr в ptr2,
т.е получить тотже результат что дает метод Assign()?

За ранее спасибо.



Вопрос не понятен.
Ты хочешь скопировать значение одного указателя в другой? Тогда так: ptr2 = ptr. Только учти, что не уничтожив предварительно объект на который указывает ptr2, получишь утечку памяти.

Если ты хочешь скопировать содержимое объектов на которые указывают эти указатели (в этом случае ты неправильно задаешь вопрос, т.к. ptr и ptr2- это всего-лишь указатели, а не объекты), то есть смысл создать оператор присваивания и конструктор копирования:

Код:
myClass
{
  public:
    int Value;

    myClass() {}  // Конструктор без параметров

    myClass(myClass& obj) // Конструктор копирования
    {
      Value = obj.Value;
    }

    myClass& operator =(myClass& obj) // Оператор присваивания
    {
      Value = obj.Value;
      return *this;
    }  
};

Т.о. можно создавать объекты и инициализировать их с помощью конструктора копирования так:
myClass* ptr2 = new myClass(*ptr);
так:
myClass obj2(*ptr);
или так:
myClass obj2 = *ptr;

А так же использовать операцию присваивания так:
*ptr2 = *ptr;

В принципе для простых классов можно и не создавать конструктор копирования и оператор присваивания, а воспользоваться дефолтными, но есть вероятность наступить в последствии на грабли.
2.1K
20 октября 2004 года
bleed
22 / / 05.07.2003
Цитата:
Originally posted by Green


Вопрос не понятен.
Ты хочешь скопировать значение одного указателя в другой? Тогда так: ptr2 = ptr. Только учти, что не уничтожив предварительно объект на который указывает ptr2, получишь утечку памяти.

Если ты хочешь скопировать содержимое объектов на которые указывают эти указатели (в этом случае ты неправильно задаешь вопрос, т.к. ptr и ptr2- это всего-лишь указатели, а не объекты), то есть смысл создать оператор присваивания и конструктор копирования:
Код:
myClass
{
  public:
    int Value;

    myClass() {}  // Конструктор без параметров

    myClass(myClass& obj) // Конструктор копирования
    {
      Value = obj.Value;
    }

    myClass& operator =(myClass& obj) // Оператор присваивания
    {
      Value = obj.Value;
      return *this;
    }  
};

Т.о. можно создавать объекты и инициализировать их с помощью конструктора копирования так:
myClass* ptr2 = new myClass(*ptr);
так:
myClass obj2(*ptr);
или так:
myClass obj2 = *ptr;

А так же использовать операцию присваивания так:
*ptr2 = *ptr;

В принципе для простых классов можно и не создавать конструктор копирования и оператор присваивания, а воспользоваться дефолтными, но есть вероятность наступить в последствии на грабли.


спасибо за ответ.
Подразумевалось именно копирование содержимого объектов. В общем ответ рещил все вопроссы, спасибо!

246
20 октября 2004 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by Green

myClass& operator =(myClass& obj) // Оператор присваивания
{
Value = obj.Value;
return *this;
}
};


А проверку на присвоение самому себе?

Цитата:
Originally posted by Green

В принципе для простых классов можно и не создавать конструктор копирования и оператор присваивания, а воспользоваться дефолтными, но есть вероятность наступить в последствии на грабли.


Если в классе есть члены-данные указатели, то надо...(это и есть грабли).

3
20 октября 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by GIZMO

А проверку на присвоение самому себе?



Согласен.
Но в данном случае и без проверки будет работать.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог