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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Большое количество указателей на один объект. 
:(
    Опции темы
Elfet
Дата 12.3.2010, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Всем привет! 

Возникла в программе у меня такая проблема - слишком большое количество указателей на один и тот же объект. И если удаляю я его, везде приходится не забыть поставить NULL. 

Можно как-нибудь более просто ссылаться на один объект из разных мест? И если удаляю его, то что бы можно было по всем указателем сразу узнать это? 

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

Это сообщение отредактировал(а) Elfet - 12.3.2010, 14:02


--------------------
PM MAIL WWW Skype   Вверх
mes
Дата 12.3.2010, 14:02 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



shared_ptr (+ weak_ptr)


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


Опытный
**


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

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



Цитата(mes @  12.3.2010,  14:02 Найти цитируемый пост)
shared_ptr (+ weak_ptr) 
Отличная связка. Нужно только понять как работает.
Цитата(Elfet @  12.3.2010,  14:00 Найти цитируемый пост)
Можно как-нибудь более просто ссылаться на один объект из разных мест? И если удаляю его, то что бы можно было по всем указателем сразу узнать это? 
Многопоточность? Если работа в одном потоке то, возомжно, достаточно только shared_ptr.


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


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


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Почитал про умные указатели. 

Правильно ли я понял как с ними работать? 

Код

shared_ptr<Mesh> mesh( new Mesh() );

//если мне нужно передать указатель в какую-нибудь метод, то делать так:

class Test {

weak_ptr<Mesh> mesh;

void SetMesh(weak_ptr<Mesh> &_mesh)
{
       mesh = _mesh;
}

}



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


Опытный
**


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

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



Цитата(Elfet @  12.3.2010,  15:34 Найти цитируемый пост)
Код

shared_ptr<Mesh> mesh( new Mesh() );
//если мне нужно передать указатель в какую-нибудь метод, то делать так:
class Test {
weak_ptr<Mesh> mesh;
void SetMesh(weak_ptr<Mesh> &_mesh)
{
       mesh = _mesh;
}
}

Всё же лучше использовать конструктор.
Код
class Test {
weak_ptr<Mesh> mesh;
void Test (const shared_ptr<Mesh> &_mesh): mesh (_mesh) {}
};

Довольно специфично. Получается, что есть некий разделяемый ресурс, время жизни которого никак не зависит от объектов класса Test. Перед тем как использовать это ресурс, надо вызвать shared_ptr weak_ptr::lock(); и если этот разделяемый ресурс всё ещё существует, то заюзать его. Обычно, это надо при многопоточном программировании. Хотя, конечно, можно придумать применение и для одного потока. 

Может объяснишь для чего именно тебе это надо?

Это сообщение отредактировал(а) Леопольд - 12.3.2010, 16:00


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


Серийный программист
****


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

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



Цитата(Elfet @  12.3.2010,  12:34 Найти цитируемый пост)
Правильно ли я понял как с ними работать? 

угу и кругом проверять не прибили ли объект
PM WWW   Вверх
mes
Дата 12.3.2010, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Elfet @  12.3.2010,  14:34 Найти цитируемый пост)
Правильно ли я понял как с ними работать? 

предчувствуя о чем идем идет речь, скажу, что библиотеку желательно делать более свободной, и не навязывать свою политику клиенту.
т.е. предоставлять набор частей и инструментов, с помощью которых пользователь за условные 5 минут, может соорудить себе нужное здание,
а не  сдавать в аренду полузаконченный-офис, на адаптацию которого может уйти условный день. smile



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


Опытный
**


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

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



Цитата(mes @  12.3.2010,  16:02 Найти цитируемый пост)
предчувствуя о чем идем идет речь
Фигасе, неконтролируемая телепатия? smile



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


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Вот такой вот пример с двумя классами Test и Over написал. 

Test:
Код

#ifndef TEST_H
#define TEST_H
#include "mesh.h"
#include <boost/shared_ptr.hpp>

class Test
{
public:
    Test();
    int testI();

    boost::shared_ptr<Mesh> mesh;
};

#endif // TEST_H

#include "test.h"

Test::Test()
    : mesh(new Mesh())
{
}

int Test::testI()
{
    return mesh->I();
}



Over:
Код

#ifndef OVER_H
#define OVER_H
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include "mesh.h"

class Over
{
public:
    Over();
    void SetMesh(boost::weak_ptr<Mesh> &_mesh);
    int Do();
private:
    boost::weak_ptr<Mesh> mesh;
};

#endif // OVER_H

#include "over.h"

Over::Over()
{
}

void Over::SetMesh(boost::weak_ptr<Mesh> &_mesh)
{
    mesh = _mesh;
}

int Over::Do()
{
    if(boost::shared_ptr<Mesh> p = mesh.lock())
    {
        return 2*p->I();
    }
    else
    {
        return -123;
    }
}



Mesh:
Код

#ifndef MESH_H
#define MESH_H
#include <iostream>

class Mesh
{
public:
    Mesh();
    ~Mesh();
    int I();
};

#endif // MESH_H

#include "mesh.h"

Mesh::Mesh()
{
    std::cout << "Mesh()" << std::endl;
}

Mesh::~Mesh()
{
    std::cout << "~Mesh()" << std::endl;
}

int Mesh::I()
{
    return 112358;
}



main.cpp
Код

#include <QtCore/QCoreApplication>
#include <iostream>

#include "test.h"
#include "over.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Test *t = new Test();

    std::cout << "testI: " << t->testI() << std::endl;

    Over *o = new Over();

    boost::weak_ptr<Mesh> weak_mesh(t->mesh);
    o->SetMesh(weak_mesh);

    std::cout << "o->Do: " << o->Do() << std::endl;

    delete t;

    std::cout << "o->Do: " << o->Do() << std::endl;


    return a.exec();
}



Выводит следующее:
Цитата

Mesh()
testI: 112358
o->Do: 224716
~Mesh()
o->Do: -123



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


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

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