【问题标题】:specialized shared_ptr conversion C++0x专门的 shared_ptr 转换 C++0x
【发布时间】:2012-03-21 10:06:05
【问题描述】:

这可能可以推广到任何模板类,但我在 shared_ptr 中遇到过这个问题。 我有这样的班级系统:

class A {
protected:
    // some data
}

class B : public A {
    // some access functions
}

class C : public A {
    // some other access functions
}

我使用这个概念是因为在我的库中我使用了一组不应向用户公开的函数,因此我将这些函数分为两个接口类。现在,我知道我可以使用一个类和朋友,但是如果需要多个类来访问这些功能,这会变得很丑。

但是,我遇到的问题是这些类在shared_ptr 中传递,我需要保留引用计数(因为数据会被破坏)。因此,我需要在此示例中将 shared_ptr<B> 转换为 shared_ptr<C>,反之亦然。如果提供了需要的功能,shared_ptr 是否允许这样的事情?如果是,那些是什么?构造函数?分配运算符?还是我需要更上一层楼并投射整个指针而不仅仅是内容?到目前为止我没有运气。

是的,如果您有更好/更简洁的方法来隐藏某些功能,我会很高兴听到它,但我也想回答这个问题。

【问题讨论】:

  • 你看过匿名命名空间吗?内部链接?
  • 我正在使用内部链接来隐藏大部分内容,但想象一下包含 B 的第 4 类 D(它包含库内部函数)。如果其他类的标题中已经需要它,则无法隐藏它。我对匿名命名空间没有什么经验,所以我可能会更多地研究它。
  • 我的意思是而不是这种继承废话,不是除了。
  • 我明白你的意思,但在我开始严肃的事情之前,也许我会在这个话题上多看看。

标签: c++ class c++11 type-conversion shared-ptr


【解决方案1】:

你想要std::static_pointer_caststd::dynamic_pointer_cast,来自<memory>

struct A {}; struct B : A {};

std::shared_ptr<B> p(std::make_shared<B>());
std::shared_ptr<A> q(std::static_pointer_cast<A>(p));
// now p and q **share** ownership over their pointed-to object.

【讨论】:

    猜你喜欢
    • 2011-02-03
    • 2011-09-27
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 2012-07-22
    相关资源
    最近更新 更多