C ++:boost:传递值参数

时间:2010-11-23 09:50:26

标签: c++

我使用Boost库中的智能指针。假设我有这个对象:

boost::shared_ptr<A> a(new A);

a->fileName = "/temp";

在B班,我有:

bool open(A *a);

private: boost::shared_ptr<A> myA;

然后我宣布一个对象B:

boost::shared_ptr<B> b(new B());

b->open(a.get());

bool B::open(A *a)
{
  *B::myA = *a;
}

上面的那些演示是关于pass by value参数。编译很好但是当我运行它时,它给出了这个错误:

/usr/local/include/boost/smart_ptr/shared_ptr.hpp:412: typename boost::detail::shared_ptr_traits<T>::reference boost::shared_ptr<T>::operator*() const [with T = NameSpaceABC::Common::A]: Assertion `px != 0' failed.
Aborted

对于上面相同的问题,我应该改变什么:通过引用参数传递?由于我是C#和Java程序员,我刚刚切换到C ++进行快速项目。我不熟悉使用指针和Boost Smart指针。

提前致谢,我非常感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

如果对对象使用智能指针指针一次,则应始终将其用于该对象。在您的情况下,open应如下所示:

bool B::open(boost::shared_ptr<A> a) {
    myA = a;
}

这样你就可以获得传递给open的对象的引用语义。您的代码示例尝试分配对象,而不是引用。在这种情况下,您必须确保myA已经包含类型为A的有效对象(最好在构造函数中):

B::B() : myA(boost::make_shared<A>()) {}

然后你可以像这样编写open方法:

bool B::open(const A & a) {
    *myA = a;
}

另外,请阅读this以了解shared_ptr的工作原理。

答案 1 :(得分:0)

您正在取消引用未指向对象的shared_ptr。

在我看来,可能有两种可能的情况。

1)你想在main和B中共享A对象。然后你应该传递shared_ptr来打开。

bool B::open(const shared_ptr<A>& a)
{
    myA = a;
}

//called with
b->open(a);

2)您希望B复制该值。然后传递对象可能是有意义的。

bool B::open(const A& a)
{
    myA.reset(new A(a));
}

//called with
b->open(*a);

或者,如果myA已指向某个对象,则无需分配新对象。

bool B::open(const A& a)
{
    if (myA)
        *myA = a;
    else
        myA.reset(new A(a));
}