C++有人更了解这种指针吗

C++ Anyone know more about this kind of pointer?

本文关键字:指针 了解 C++      更新时间:2023-10-16

我有一个World类和一个Entity类。World类创建新的Entite并重新运行指向它的指针。如果我使用那个指针,我永远不确定那个指针是否仍然指向一个有效的实体,但我也不想使用shared_ptr,因为在释放所有shared_ptr之前,实体不会被删除。所以过了一段时间,我发现了这个指针:

#include <iostream>
#include <unordered_map>
template<class T>
class Pointer
{
public:
Pointer() :m_ptr(nullptr){}
Pointer(T*p) :m_ptr(p) { m_ptr->addPtr(this); }
~Pointer() { if(valid()) m_ptr->removePtr(this); }
Pointer(const Pointer &other) :m_ptr(other.m_ptr) 
{
if(valid())
m_ptr->addPtr(this);
}
Pointer& operator=(const Pointer& other)
{
if (valid())
m_ptr->removePtr(this);
m_ptr = other.m_pObj;
if (valid())
m_ptr->addPtr(this);
return *this;
}
T* operator->() { return m_ptr; }
T* operator*() { return *m_ptr; }
T* get() { return m_ptr; }
bool valid() { return m_ptr != nullptr; }
private:
template<typename T>
friend class PointerCollector;
T * m_ptr;
};
template <class T>
class PointerCollector
{
public:
PointerCollector() = default;
virtual ~PointerCollector()
{
for (auto &x : m_ptrList)
{
(x.second)->m_ptr = nullptr;
}
}
private:
void addPtr(Pointer<T> *ptr)
{
m_ptrList[ptr] = ptr;
}
void removePtr(Pointer<T> *ptr)
{
m_ptrList.erase(ptr);
}
template<typename T>
friend class Pointer;
std::unordered_map<Pointer<T>*, Pointer<T>*> m_ptrList;
};

class Test : public PointerCollector<Test>
{
public:
Test() {}
~Test() = default;
int getVal() { return m_val; }
private:
int m_val = 100;
};

void func(Pointer<Test> ptr)
{
if (ptr.valid())
{
std::cout << ptr->getVal();
}
else
{
std::cout << "Invalid!n";
}
}
int main()
{
Test* myTest = new Test();
Pointer<Test> myPtr(myTest);
Pointer<Test> myPtr2(myPtr);
delete myTest;
func(myPtr2);

getchar();
return 0;
}

Test类将收集指向它的指针,并在该类被删除时使其无效。

现在我想问一下,是否有人知道关于这种指针的更好的实现或更多信息。

我在Visual Studio 2017 中编译并测试了上述代码

答案是肯定的,这种模式以前被很多人使用过。您刚刚创建了::std::weak_ptr<T>的一个糟糕的(而且是坏的,因为至少有一个彻底的错误和一些次优的东西)重新实现。你应该考虑使用它。