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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Smart Pointer 
:(
    Опции темы
sol78
Дата 27.1.2008, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



как правильно написать свой Smart Pointer (не универсальный) а скажем,  для своего класса String??
- что иммено в нем должно бить?
вот я тут набрасала:
.h
Код

#ifndef _SMART_PTR
#define _SMART_PTR
#include <string>

class SmartPtr
{
    char* buff;
    SmartPtr * next;
    SmartPtr * prev;
    static SmartPtr* head;
    int count;
    SmartPtr(const char* buff=0);// constructor
    ~SmartPtr(); //Destructor
    SmartPtr* getSPbyValue(const char* buff);
public:
    static SmartPtr* createMemory(const char*);
    static bool destroyMemory(SmartPtr*);
    const char* get_buff();
    bool update(const char* );
};


#endif


.cpp
Код

#include "SmartPtr.h"

SmartPtr::SmartPtr(const char* str):count(0), buff(0), next(0), prev(0)
{
    if(str){
        ++count; //count ==1, is original
        buff=new char[strlen(str)+1];
        strcpy(buff, str);
    }
}

SmartPtr* SmartPtr::head=0;

SmartPtr::~SmartPtr()
{
    delete[] buff;
}


SmartPtr* SmartPtr::createMemory(const char* str)
{
        SmartPtr* ptr;
        
        if(head==0)
        {
            ptr=new SmartPtr(str);
            head=ptr;
            head->prev=0;
        }
    
        else
        {
            ptr=SmartPtr::head;
            if(ptr->getSPbyValue(str)!=0)
            { //str exists
                ptr->count++;
            }
            else
            { //str not exists
               ptr=new SmartPtr(str);
               head->prev=ptr;
               ptr->next=head;
               head=ptr;
            }
        }
   return ptr;
}

SmartPtr* SmartPtr::getSPbyValue(const char* buff)
{
    SmartPtr* tmp;
    
    if(SmartPtr::head)
    {
        tmp=SmartPtr::head;
        while(tmp)
        {
            if(strcmp(tmp->buff, buff)==0)
            {
               return tmp;
            }
            tmp=tmp->next;
        }
    }
    return 0;
}




 bool SmartPtr::destroyMemory(SmartPtr* ptr)
 {
     bool rc=false;

     if(ptr)
     {
         if(ptr->count==1)// is original
         {
             if(head->next==0)//ptr is single
             {
                 head=0;
             }

             else if(ptr==head)//ptr in head
             {
                 head=ptr->next;
                 head->prev=0;
             }
             else if (ptr->next==0)//ptr in tail (last)
             {
                 ptr->prev->next=0;
             }
             else //ptr is between 
             {
                 ptr->prev->next=ptr->next;
                 ptr->next->prev=ptr->prev;
             }
             delete ptr;
             rc=true;
         }
         else
             --(ptr->count);
     }
     return rc;
 }
//не работает........

 bool SmartPtr::update(const char* up_str)
 {
     bool rc=false;
     SmartPtr* tmp;

     if(strcmp(this->buff,up_str)!=0)
     {
               //destroy this
         SmartPtr::destroyMemory(this);

         if((tmp=getSPbyValue(up_str))!=0)
             //up_str exists
         {
;
             //this=tmp;
             tmp->count++;
         }
         else
         {
             SmartPtr::createMemory(up_str);
         }
         rc=true;
     }
     return rc;
 }             

        


 const char* SmartPtr::get_buff()
 {
     return this->buff;
 }




    

-т.ж. функция update(..) не работает, д/б реализован pattern copy on write (я так думаю..)
-С удовольствием приму все замечания и предложения!!!



PM MAIL   Вверх
JackYF
Дата 27.1.2008, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Огласи-ка сначала задачи, которые этот смарт-поинтер должен выполнять. Я лично вот не понял.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
sol78
Дата 27.1.2008, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



1 считает ссылки
2 не дублирует обьекты, т.е. если есть стринг "вася" , другого быть не должно, просто увеличеваем счетчик..
3 реализует COW
4 удаление - гарбич коллектор

остальное и является вопросом...т.е. как его рассширить, чтобы класс Стринг стал  оочень простим?

Это сообщение отредактировал(а) sol78 - 27.1.2008, 22:32
PM MAIL   Вверх
Fazil6
Дата 27.1.2008, 22:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

#ifndef _SMART_PTR
#define _SMART_PTR
#include <string>        // на кой этот иклуд тут воткнут?

Цитата(sol78 @  27.1.2008,  21:01 Найти цитируемый пост)
т.ж. функция update(..) не работает, д/б реализован pattern copy on write (я так думаю..)

у меня закралось сильное сомнение, что мы по разному понимаем термин "smart pointer". Впервую очередь предполагается, что смартпоинтер используется по значению и имеет перегруженный конструктор копии и оператор присваивания. У тебя же какая-то замороченная обертка над массивом символов скорее смахивающая на попытку реализации строкового класса и честно говоря в логику его я не втыркнул особо.

Добавлено через 5 минут и 8 секунд
чем больше смотрю на эту реализацию, тем менее понимаю идеи. Вижу интерфейс
Код

public:
    static SmartPtr* createMemory(const char*);
    static bool destroyMemory(SmartPtr*);
    const char* get_buff();
    bool update(const char* );

слабо себе представляю зачем такие функции у смартпоинтера и как я бы им пользовался. 
PM MAIL   Вверх
JackYF
Дата 27.1.2008, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Fazil6, вот у меня такие же мысли.

sol78, давай пример использования этой штуки в студию.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Lazin
Дата 28.1.2008, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(Fazil6 @  27.1.2008,  22:38 Найти цитируемый пост)
слабо себе представляю зачем такие функции у смартпоинтера и как я бы им пользовался. 

А я слабо себе представляю как можно пользоваться смарт поинтером не реализующим операторы -> и *  smile 
смарт поинтер должен иметь ту-же семантику что и указатель

Добавлено через 1 минуту и 45 секунд
Джеф Элджер - "Библиотека программиса" - почти вся книга про смарт поинтеры
PM MAIL Skype GTalk   Вверх
JackYF
Дата 28.1.2008, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Lazin @  27.1.2008,  23:10 Найти цитируемый пост)
почти вся книга про смарт поинтеры 

может, всё-таки одна треть? smile там ещё немало полезного по другим темам.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
sol78
Дата 28.1.2008, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Fazil6 @ 27.1.2008,  22:38)

у меня закралось сильное сомнение, что мы по разному понимаем термин "smart pointer". Впервую очередь предполагается, что смартпоинтер используется по значению и имеет перегруженный конструктор копии и оператор присваивания. У тебя же какая-то замороченная обертка над массивом символов скорее смахивающая на попытку реализации строкового класса и честно говоря в логику его я не втыркнул особо.

Я согласна, что интерфейс не годиться....
поэтому возник данный вопрос. - как правильно написать свой Smart Pointer (не универсальный) а скажем,  для своего класса String??

О примере использования могу только сказать что
Код

SmartPtr* ptr= new SmartPtr();//ошибка компиляции

PM MAIL   Вверх
JackYF
Дата 28.1.2008, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(sol78 @  28.1.2008,  13:20 Найти цитируемый пост)
как правильно написать свой Smart Pointer (не универсальный) а скажем,  для своего класса String

Тут уже советовали - почитай, к примеру, Джеффа Элджера, у него эта тема много и с разных сторон мусолится.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Lazin
Дата 28.1.2008, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Идиома COW хорошо описана в книге - С. Мейерс "Наиболее эффективное использование С++". Там в конце книги есть примеры программирования, один из них, это как раз реализация COW на примере строк.
PM MAIL Skype GTalk   Вверх
Ulysses4j
Дата 28.1.2008, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(sol78 @ 28.1.2008,  15:20)
О примере использования могу только сказать что
Код

SmartPtr* ptr= new SmartPtr();//ошибка компиляции

Умные укзатели это классы, объекты которых обычно используются по значению, так что вам нужно ориентироваться на интерфейс вроде
Код
SmartPt ptr(/*???*/);

Конструктора по умолчанию быть не должно: другая отличительная черта умных указателей это использование идиомы RAII - Resource Acquisition Is Initialization (захват ресурса на стадии инициализации). Поясню. Умные указатели предназначены для автоматизации управления ресурсами, которые требуют ручной инициализации и зачистки, примером в вашем случае может служить символьная строка в динамической памяти (куче) — память нужно выделять new, а зачищать - delete. RAII означает, что захват управляемых ресурсов должен происходить при инициализации объекта класса умного указателя, то есть примерно так:
Код
SmartPt ptr( new char[n] );

Клиентскому коду, использующему ваш умный укзатель, достаточно вызвать только конструктор, как показано выше, delete же будет вызван в деструкторе SmartPt, незаметно для клиента.
Код

class SmartPointer {
  char* data;
  // ...
public:
  SmartPointer(char* aData) : data(aData) {}
// ...
  ~SmartPointer() { delete[] data; }
}

Далее необходимо реализовать в вашем классе хотя бы минимальный традиционный интерфейс указателей, как был совершенно справедливо указано выше - operator*() и operator++().

Важным моментом является реализация операций копирования (конструктора копирования и операции копирующего присваивания — SmartPointer(SmartPointer const&) и operator=(SmartPointer const&)). Для начала я советую реализовать самый простой вариант, когда при копировании умных указателей, копируются соответсвующие сегменты памяти. За copy-on-write и подсчет ссылок лучше взяться потом.

Это сообщение отредактировал(а) Ulysses4j - 28.1.2008, 15:11


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
Fazil6
Дата 28.1.2008, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Ulysses4j @  28.1.2008,  14:08 Найти цитируемый пост)
Конструктора по умолчанию быть не должно

почему же? Вполне может быть конструктор поумолчанию
PM MAIL   Вверх
Ulysses4j
Дата 28.1.2008, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да, погорячился, идиоматический вызов с new сбил с толку.

Это сообщение отредактировал(а) Ulysses4j - 28.1.2008, 15:54


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
sol78
Дата 28.1.2008, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо за советы!
Вопрос конкретный :
как мне написать конструктор для SmartPointer, который не дублирует обьекты, т.е. если есть  уже "вася"
нового "вася" быть не должно . И результат его работы : this указывает на существующий  smart pointer
и  counter++;?

Добавлено через 1 минуту и 21 секунду
Цитата(Fazil6 @  28.1.2008,  15:32 Найти цитируемый пост)
почему же? Вполне может быть конструктор поумолчанию 

да тут без вопросов
PM MAIL   Вверх
Fazil6
Дата 28.1.2008, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(sol78 @  28.1.2008,  14:53 Найти цитируемый пост)
как мне написать конструктор для SmartPointer, который не дублирует обьекты, т.е. если есть  уже "вася"

сделать ставический список, где лежат все значения. При создании нового экземпляра смотреть в этом списке. Тока нужна синхронизация для многопоточности и это не COW.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1268 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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