gpt4 book ai didi

C++:创建模板化的 Shared 对象而不是 shared_ptr 对象

转载 作者:太空狗 更新时间:2023-10-29 23:47:41 25 4
gpt4 key购买 nike

根据我之前的 question , 我希望 boost::shared_ptr<A>实际上是 A 的子类(或者可能是 A* ),以便它可以用于采用 A* 的方法中作为他们的论点。

考虑以下类:

class A
{
public:
A(int x) {mX = x;}
virtual void setX(int x) {mX = x;}
virtual int getX() const {return mX;}
private:
int mX;
};

在上一个问题中,我提议创建一个 SharedA 对象来处理这个问题,并且大概是这样。

class SharedA : public A
{
public:
SharedA(A* a) : mImpl(a){}
virtual void setX(int x) {mImpl->setX(x);}
virtual int getX() const {return mImpl->getX();}
private:
boost::shared_ptr<A> mImpl;
};

如果我可以创建一个模板类来为我处理所有这些事情,那就太好了。

template <class T>
class Shared : public T
{
public:
SharedT(T* t) : mImpl(t)
{
//What kind of crazy voodoo goes here?
}

private:
boost::shared_ptr<T> mImpl;
};

如果我有这个(连同 Shared<T> 中的适当构造函数),那么我可以执行以下操作:

A* indestructo_A = new Shared<A>(new A(100));
A* indestructo_A_clone = new Shared<A>(indestructo_A);
delete indestructo_A
cout << "Indestructo-A back with a vengence!" << indestructo_A_clone.getX();

问题:

  1. 这有用吗?或者它只在处理特别糟糕的代码的极端情况下有用。例如:

    void aFunctionYouHaveToUse(A* a){ /一些有用的算法,然后/
    删除一个;

  2. 是否可以构建这样的模板类? (我猜你需要反射,对吧?)如果你能构建它,如何构建?

最佳答案

shared_ptr 不允许显式转换为 A* 有一个非常非常好的理由(有比继承更好的方法,无论如何这是不可能的)。 shared_ptr 和其他智能指针的全部目的是提供一个小型封装对象,其唯一目的是拥有一个指针并决定何时以及如何删除它。

如果这个对象允许同一个指针不假思索地巧妙地传递,那么它根本无法达到它的目的。任何时候你深入研究一个智能指针以获取内部的原始指针,你都违反了它的所有权语义,然后必须非常小心,不要去做一些愚蠢的事情。智能指针通过强制您调用以获取内部指针而不是在您不小心将其传递给错误类型的函数时默默地这样做,从而使您考虑到这一点。把它想象成智能指针在说:“嘿,你知道你在做什么可能很危险,对吧?好吧,开始吧。”

恕我直言,如果共享指针不允许访问它们的指针,宇宙将会变得更美好。不幸的是,那不是这个宇宙,也不可能是这个宇宙,因为偶尔你仍然需要把那个东西传递给一个不使用智能指针的函数。所以,由于我们没有生活在那个更好的宇宙中,我们的智能指针确实允许访问,只是它们不是荡妇而已。

关于C++:创建模板化的 Shared<T> 对象而不是 shared_ptr<T> 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4411320/

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