0

Я реализую шаблон smartpointer, и есть одна вещь, которая меня богует; как увеличить счетчик ссылок при передаче smartpointer в качестве параметра другой функции? Какой оператор перегружать, чтобы увеличить количество ссылок?Передача умного указателя в качестве параметра функции

Например:

class test 
{ 
    test() { } 
    ~test() { } 
}; 

void A() 
{ 
    SmartPointer<test> p; 
    B(p); 
} 

void B(SmartPointer<test> p) 
{ 
    C(p); 
} 

void C(SmartPointer<test> p) 
{ 
    // p ref count is still 1 and will be destroyed at end of C 
} 

Благодаря

+1

¤ ** Если ** вы сами реализуете вызовы ref-count, вы должны сделать это в каждом конструкторе (включая конструктор копирования) и деструкторе. Но вам это не нужно. Просто используйте 'boost :: intrusive_ptr' - который, несмотря на то, что имя не нужно использовать для реализации интрузивного указателя, он просто заботится о них, обращаясь к ним. Cheers & hth., –

+0

Будьте предупреждены. Даже самые умные ребята из C++ не могут написать правильный умный указатель. Скотт Майерс часто говорит о своей попытке в своих лекциях (спустя 5 лет после публикации (после того, как он был широко рассмотрен перед публикацией)), он говорит, что по-прежнему получает электронные сообщения об этом. У умных указателей в стандарте было 100 тысяч людей, которые смотрели на них, чтобы проверить их, чтобы убедиться, что ошибок нет. –

ответ

5

Все Конструкторы смарт-указатель должен манипулировать RefCount, в том числе конструктор копирования и оператор присваивания также должны быть вовлечены.

Если это вас озадачивает, для вас может быть слишком рано писать свои собственные умные указатели; вместо этого вы можете использовать высококачественное std::shared_ptr.

+0

Что такое конструктор копирования? – KaiserJohaan

+1

@KaiserJohaan: Это конструктор с подписями 'T :: T (T const &)' или 'T :: T (T &)', обычно первый. –

1

Его следует позаботиться в своем конструкторе копирования, а также в вашем операторе присваивания.

2

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

Либо это, либо использовать boost :: shared_ptr или какой-либо другой существующий класс. Вы почему-то не используете это?

+0

Что такое конструктор копирования? – KaiserJohaan

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