2013-07-14 4 views
1

У меня есть общий указатель, который я поделил с системой. Позже я хочу заменить фактическое содержимое этих общих указателей, но все же сохранить все общие указатели действительными, поэтому они внутренне указывают на этот новый объект.Замена содержимого общего указателя?

Есть ли простой способ сделать это с помощью общих указателей?

Вроде как это я ищу - псевдокоде

typedef boost::shared_ptr<Model> ModelPtr 

ModelPtr model1 = ModelPtr(new Model); 
ModelPtr model2 = model1; 

// make something like 'model1.get() = new Model' so model1, model2 both points to a new model 

EDIT: Я хочу, чтобы эффект этого, но менее gimicky

ModelPtr model1 = ModelPtr(new Model("monkey")); 
memcpy(model1 .get(), new Model("donkey"), sizeof(Model)); 
+0

Возможно, вы можете использовать 'shared_ptr >'? – rodrigo

+2

Будет ли '* model1 = Model {};' делать то, что вам нужно? – aschepler

ответ

1

Если я вас правильно понял - ты может использовать перегруженный оператор разыменования:

auto a = std::make_shared<int>(42); 
auto b = a; 
*a = 43; 

std::cout << *b << std::endl; 

Выход:

43 
0

Каждый shared_ptr экземпляр имеет свою собственную копию указателя, так что нет никакого способа для любого shared_ptr например, чтобы знать и влиять на указатели других справочных подсчетом shared_ptr экземпляров.

ли вы вместо того, чтобы просто хотите model2 быть ссылка к model1 так, что при сбросе model1, model2 поставляется вместе с изменением?

В противном случае вы можете подробнее рассказать о реальной проблеме, которую пытаетесь решить?

+0

И модели1, и модель2 указывают на тот же экземпляр модели и на то же место в памяти? Я хочу изменить данные в этой ячейке памяти, чтобы она представляла другой экземпляр модели - это невозможно? – KaiserJohaan

Смежные вопросы