gpt4 book ai didi

C++ 有人知道更多关于这种指针的信息吗?

转载 作者:行者123 更新时间:2023-11-30 03:27:36 24 4
gpt4 key购买 nike

我有一个世界级和一个实体级。World 类创建新的实体并重新调整指向它的指针。如果我使用该指针,我永远不确定该指针是否仍指向有效的实体,但我也不想使用 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;
}

测试类将收集指向它的指针,并在类被删除时使它们失效。

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

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

最佳答案

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

关于C++ 有人知道更多关于这种指针的信息吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47214352/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com