C++有人更了解这种指针吗
C++ Anyone know more about this kind of pointer?
我有一个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>
的一个糟糕的(而且是坏的,因为至少有一个彻底的错误和一些次优的东西)重新实现。你应该考虑使用它。
相关文章:
- C++我需要了解在哪里使用指针和双指针
- 尝试了解C++指针和数据类型初始化
- 检查模板中 nullptr 的函数指针,了解任何类型的可调用对象
- 我试图了解在异或操作后指针变量正在更改
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- 确认了解指向函数的指针
- 需要更好地了解使用 Windows API 的智能指针
- 了解 ARM 程序集说明和 C/C++ 指针
- 了解const自动指针
- 简单的功能大小;了解指针-指针差异
- 了解常量指针指向C++中的常量值
- 了解班级共享指针及其在继承中的使用
- C++有人更了解这种指针吗
- 基本指针如何能够在派生的类实例中了解基本成员的内存位置
- 需要帮助了解指针变量分配
- 了解 C++ 中数组和指针的差异/相似之处
- 了解std ::交换指针和std :: vectors
- 了解指针强制转换
- 使用'new'和指针了解C++代码
- 在 C 语言中使用 *&*&p 了解复杂的指针和地址运算符