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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатель на абстрактный класс 
:(
    Опции темы
zhenya1
Дата 11.11.2010, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть базовый класс и 2 производных от него( 2.cpp)  и реализация "умного" указателя ( 1.cpp).
Проблема: При запуске код срывается и ссылается на   void add(){ count ++;} :

this    0x00000000 {count=??? pointer=??? }    


1.cpp ( smart pointer)

Код

template <typename type>

class Aptr
{
private:

    class A {

private:
    int count;
    type *pointer;

public:

    A(type *some_pointer) {pointer = some_pointer;count =1;}
    ~A(){delete pointer;}
    void add(){ count ++;}
    void del()
    { 
        if(--count==0) 
            delete this;
    }
    type * get ()  { return pointer; }
    };

public:
    Aptr() { aptr = 0;}
    Aptr(type *some_pointer) { aptr = new A(some_pointer);}
    ~Aptr(){ del();}
    Aptr (const Aptr &some_Aptr) { aptr=0; cop(some_Aptr);}

    type *operator ->() {return aptr->get();}
    type & operator * () { return *aptr->get; }
    Aptr & operator = (const Aptr &some_Aptr) { cop(some_Aptr); return *this;}

protected:
     void add() { aptr->add();}
     void del(){ aptr->del();}
   void cop(const Aptr &some_Aptr)
   {
       add();
       aptr = some_Aptr.aptr;
       del();
   }

private:
    A *aptr;
};


2.cpp ( класс и его производные классы)

Код

class base    
{
public:
    int n;
    base(){n=0;}
    virtual ~base(){}
    virtual void AddDate()=0;
    virtual void print()=0;
    virtual void WeightSort(){}
};
class first:public base
{
public:
    first(){naznachenie=NULL; weight=NULL;}
    virtual ~first();
    void AddDate();
    void print()
    {
        for(int i=0;i<n;i++)
        cout<<"naznachenie: "<<naznachenie[i]<<"; weight: "<<weight[i]<<endl;
    }
    void WeightSort(); 
private:
    char **naznachenie;
    int *weight;
};
class second:public base
{
public:
    second(){adress=NULL;}
    virtual ~second();
     void AddDate();
    void print(){
        for(int i=0;i<n;i++)
            cout<<"name: "<<name[i]<<"; adress:"<<adress[i]<<endl;}
private:
    char **name;
    char **adress;
};

... // реализация полей классов

void main()
{
Aptr<base> ptr;
ptr = new first;
ptr->AddDate();

system("PAUSE");
}


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



это 
Код

Aptr & operator = (const Aptr &some_Aptr) { cop(some_Aptr); return *this;}

вызывает метод cop, в котором вызывается Add.
Код

void add() { aptr->add();} //обращение к указателю

На момент вызова Add метод cop еще не скопировал указатель, потому и падает.

Пологаю вам адо писать как-то так:
Код

   void cop(const Aptr &some_Aptr)
   {
       aptr = some_Aptr.aptr;
       add();
       del();
   }


хотя я не разбирался насколько "умный" этот указатель, но уж чета сильно закрученный..


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
zhenya1
Дата 11.11.2010, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот еще проблема:  почему ptr  не получает значение count ?
Код

void main()
{
Aptr<base> ptr; 
ptr = new first;
ptr->AddDate();


PM MAIL   Вверх
Леопольд
Дата 12.11.2010, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сравни. 
Код
template <typename type>
class Aptr
{
private:
    class A {
    private:
        int count;
        type *pointer;

    public:
        explicit A(type *some_pointer) {pointer = some_pointer;count =1;}
        ~A(){delete pointer;}

        void add(){ count ++;}
        void del()
        {
            if(--count==0)
                delete this;
        }
        type * get ()  { return pointer; }
    };

    static A nullPtr;

public:
    Aptr(): aptr(&nullPtr) { aptr->add(); }
    explicit Aptr(type *some_pointer): aptr(new A(some_pointer)) {}
    ~Aptr(){ aptr->del(); }

    Aptr (const Aptr &some_Aptr) { copy(some_Aptr); }
    Aptr & operator = (const Aptr &some_Aptr) { copy(some_Aptr); return *this;}

    type *operator ->() {return aptr->get();}
    type & operator * () { return *aptr->get(); }

private:

   void copy(const Aptr &some_Aptr)
    {
        aptr->del();
        aptr = some_Aptr.aptr;
        aptr->add();
    }

    A *aptr;
};

template <typename type>
typename Aptr<type>::A Aptr<type>::nullPtr(NULL);



Это сообщение отредактировал(а) Леопольд - 12.11.2010, 15:27


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Леопольд
Дата 12.11.2010, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



zhenya1, не помешает шаbлонный конструктор копии и шаbлонный оператор копирования. Что bы можно bыло делать так:
Код
Aptr<base> ptr1(new first); 
Aptr<second> ptr2(new second); 

Aptr<base> ptr3(ptr2);
ptr1 = ptr2;



Это сообщение отредактировал(а) Леопольд - 12.11.2010, 15:20


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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