我使用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指针。
提前致谢,我非常感谢您的帮助!
答案 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));
}