【问题标题】:correct way to initialize a variable of the type boost::shared_ptr<A>初始化 boost::shared_ptr<A> 类型变量的正确方法
【发布时间】:2014-04-30 08:33:51
【问题描述】:

我不确定我做的是否正确,因此问了这个问题..
boost::shared_ptrreset函数指针可以用来初始化boost::shared_ptr&lt;A&gt;类型的变量。 下面是我在我的代码中完成的示例代码:

struct A
{

};

struct B
{
   int x;
   std::string ss;

   boost::shared_ptr<A> A_ref; 

};

setdata(struct B *b)
{
   b->x=10;
   b->ss="hello";

   b->A_ref.reset(new A()); // initializing A_ref variable using reset function.
}

以上初始化A_ref变量的方式好还是有什么其他作用。

谢谢,

【问题讨论】:

    标签: c++ visual-studio-2012 serialization boost


    【解决方案1】:

    您可以使用构造函数和/或 setter 函数来避免独立函数:

    #include <boost/shared_ptr.hpp>
    #include <boost/make_shared.hpp>
    
    struct A {};
    struct B
    {
       int x;
       std::string ss;
       boost::shared_ptr<A> A_ref;
    
       B()
       :    x(10), ss("hello"), A_ref(boost::make_shared<A>())
       {}
    
       void set();
    };
    
    void B::set() {
       x=10;
       ss="hello";
       A_ref = boost::make_shared<A>();
    }
    

    注意:make_shared 更可取(参见@sehe 的回答)。

    旁注:您可以将setdata(struct B *b) 替换为setdata(B *b)(此处省略不必要的结构)

    【讨论】:

      【解决方案2】:

      是的,这是重置共享指针的预期方式。

      http://en.cppreference.com/w/cpp/memory/shared_ptr/reset

      Assignment 也受支持,并且具有相似的语义。

      b->A_ref = boost::make_shared<A>();
      

      Make-shared 通常是首选,因为

      • 它有助于在具有多个共享指针参数的函数调用中获得异常安全性
      • 它可以使引用计数的内存表示更有效

      【讨论】:

      • 感谢您的回答。当我尝试分配方法时..它给出错误说“没有运算符匹配这些操作数”。
      • 它仍然给我错误 - 没有运算符 "=" 匹配这些操作数操作数类型是: boost::shared_ptr = std::shared_ptr
      • @user3382670 它在那里说:您正在混合 boost 和 std shared_ptr。这不是您想要的(尽管如果您坚持,您可以通过 hack 使其“工作” - 参见例如这个答案stackoverflow.com/a/6327305/85371
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2017-02-23
      相关资源
      最近更新 更多