Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как не создавать временный объект 
V
    Опции темы
xTr1m
Дата 22.3.2011, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: 1
Всего: 1



Доброго времени суток. Скажите пожалуйста, каким способом нужно реализовывать следующую ситуацию:
У меня есть объект с атрибутами. Их много, это не только текст и цифры, но и файлы + ссылки на другие объекты. Мне нужно дать пользователю создать копию этого объекта, но с другим обозначением. Сейчас реализовано так: я создаю точную копию объекта и отображаю диалог (где пользователь может что то поменять). А если юзер нажмет "Отмену", то вновь созданный объект удаляется. И вот этот момент мне очень не нравится. Я не хочу создавать объект, а потом его удалять. Наверняка существует какой-нибудь паттерн или что-нибудь еще более элегантное, чем мое решение сейчас. Буду благодарен.
PM MAIL WWW ICQ   Вверх
azesmcar
Дата 22.3.2011, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Copy-On-Write - если я тебя правильно понял.
Копия произойдет тогда, когда это действительно необходимо, в остальное же время оба объектa будут ссылаться на одни и те же данные.
Легко реализуется через boost::shared_ptr и идиому PIMPL.

cow.hpp
Код

template <typename T, template<typename> class S = boost::shared_ptr>
class copy_on_write
{
public:
    copy_on_write(T * ptr): impl_(ptr) {}
    T * operator -> ()
    {
        if (!impl_.unique())
        {
            impl_ = S<T>(new T(*impl_));
        }
        return impl_.get();
    }
    const T * operator -> () const
    {
        return impl_.get();
    }
private:
    S<T> impl_;
};


x.hpp
Код

/* заголовочный файл */
/* x.hpp */
#pragma once
#ifndef x_hpp_included_
#define x_hpp_included_
class X
{
public:
    X();
    void print();
private:
    class ximpl;
    copy_on_write<ximpl> impl_;
};
#endif // x_hpp_included_


и реализация
x.cpp
Код

/* файл реализации */
/* x.cpp */

#include <iostream>
#include "x.hpp"

/*************************************/
class X::ximpl
{
private:
    int x;
public:
    ximpl();
    int increment();
};
/*************************************/
X::ximpl::ximpl() : x(0)
{
}
/*************************************/
int X::ximpl::increment()
{
    return ++x;
}
/*************************************/
X::X() : impl_(new ximpl())
{
}
/*************************************/
void X::print()
{
    std::cout << impl_->increment() << std::endl;
}
/*************************************/

main.cpp
Код

#include "x.hpp"

int main()
{
    X x1;
    x1.print(); // 1
    x1.print(); // 2

    // видимость копирования, но оба объект ссылаются на одни и те же данные
    X x2 = x1;

    x1.print(); // 3 - тут происходит реальное копирование объекта
    x2.print(); // 3 - дальше каждый объект живет своей жизнью
}


Это сообщение отредактировал(а) azesmcar - 22.3.2011, 15:03
PM   Вверх
xTr1m
Дата 22.3.2011, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: 1
Всего: 1



Спасибо, буду разбираться.
PM MAIL WWW ICQ   Вверх
mes
Дата 22.3.2011, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(xTr1m @  22.3.2011,  13:54 Найти цитируемый пост)
 Сейчас реализовано так: я создаю точную копию объекта и отображаю диалог 

данные с объекта заносятся в диалог, по OK заносятся с диалога в объект, при ОТМЕНА ничего с объектом не делается..
зачем копия ?
или Вы диалог жестко с объектом связали ? не желательный подход.. 



--------------------
PM MAIL WWW   Вверх
Artemon
Дата 22.3.2011, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



А почемубы не сделать примерно так:

1. Открываем диалог - заполняем его поля из оригинального объекта.
2. Нажали отмена - не делаем ничего.
3. Нажали Ok - Создали новый объект через конструктор копирования. (либо просто из диалога все поля перенеслибы в новый объект).


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
xTr1m
Дата 23.3.2011, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: 1
Всего: 1



mes, ну да. в диалог передается объект, а потом уже, если объект != 0 заполняются поля диалога данными из объекта. А какая альтернатива, что бы я знал. Делать так как предложил Artemon?
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1793 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.