Вот что я пытаюсь достичь:Как это сделать с помощью Smart Pointers?
#include <iostream>
using std::cout;
#include <vector>
using std::vector;
int main()
{
vector<int> a {3, 7};
int *p = &a.at (0); //assign 3
for (int i = 0; i < 10; ++i) //swap and print (3,7,3...)
{
p = (*p == a.at (0) ? &a.at (1) : &a.at (0));
cout << *p << '\n';
}
}
Я хотел бы использовать смарт-указатели вместо сырых указателей, видя, как они гораздо лучше, но не могу понять, как реализовать переключение назад и вперед (это должно использоваться для поочередно в игре, это Player *
).
Я попытался заменить указатели здесь с std::unique_ptr
и std::shared_ptr
в двух отдельных тестах, используя reset
для переключения, причем оба дает случайные числа после первого, как и ожидалось.
Далее я пробовал с std::weak_ptr
, поскольку он выглядит так, как мне нужно, хотя интерфейс на самом деле не такой. Из того, что я видел, единственный способ использовать его - lock()
, поэтому я попробовал добавить lock().
к звонкам reset
и добавить его к разыменованию, но это разбилось.
Как использовать std::weak_ptr
вместо необработанного указателя, или я могу каким-то образом использовать один из них?
Здесь вам не нужен weak_ptr, так как нет цикла. Почему не работает shared_ptr? Я бы предложил разместить этот код, ошибку, которую вы получаете, и попросить о помощи там. unique_ptr не будет работать, потому что ... ну, только один может указать на одно и то же ... это * уникальный *. –
@CrazyEddie, общий указатель не работает, потому что он единственный, указывающий на него, поэтому, когда он переключается на другого игрока, ничто не указывает на первое. – chris