我有一个虚拟课程basic_action
。类sippeers
继承了类basic_action
。存储我正在使用sippeers
的{{1}}个类的实例。这是代码示例:
boost::ptr_list
在这里,我创建了一个boost::ptr_list<basic_action> ActionsList;
sippeers spclass;
ActionsList.push_back(&spclass);
basic_action *sp = ActionsList.front();
实例,其中包含指向prt_list
类实例的指针。
接下来,我将创建basic_action
类的新实例。
接下来,我将sippeers
类的指针插入sippeers
。
最后一个字符串失败。
无法从'basic_action'转换为 'basic_action *'。
但内部有一个ptr_list
,而不是basic_action *
!
答案 0 :(得分:5)
boost::ptr_list::front()
返回对模板化类型的引用,而不是指针。
所以在这种情况下,它返回basic_action&
。
请参阅ptr_sequence_adapter
的文档here,ptr_list
派生自boost::ptr_list<basic_action> ActionsList;
sippeers spclass;
ActionsList.push_back(&spclass);
basic_action &sp = ActionsList.front();
。
所以你的代码应该是:
{{1}}
答案 1 :(得分:2)
ptr_list :: front()返回对列表中第一个对象的引用。 如果basic_action是具体类型,则可以满足以下两个条件。
// 1
basic_action& sp = ActionsList.front();
// 2
basic_action sp = ActionsList.front();
#1会使sp成为对列表中第一个对象的引用。换句话说,您通过sp进行的任何更改也会更改列表中的第一个对象。
#2将实例化一个新的basic_action对象,并将列表中第一个对象的内容复制到这个新对象中。对它的任何更改都不会影响列表中的第一项。
如果basic_action是一个抽象类选项,那么#2将不再可用,因为您无法实例化抽象类对象。
另外,您不应将堆栈分配的对象放入boost指针容器中。当ptr_list超出范围并尝试删除它包含的所有对象时,会发生错误。而是做类似的事情:
boost::ptr_list<basic_action> ActionsList;
ActionsList.push_back(new sippeers);
basic_action& sp = ActionsList.front();
答案 2 :(得分:0)
如果查看header,您会看到:
template
<
class T,
class VoidPtrSeq,
class CloneAllocator = heap_clone_allocator
>
class ptr_sequence_adapter
{
public: // construct/copy/destroy
template< class InputIterator >
assign( InputIterator first, InputIterator last );
template< class InputRange >
assign( const InputRange& e );
public: // element access
T& front();
(注意; ptr_list直接继承自ptr_sequence_adapter)所以你得到的是类型,而不是对类型的引用;它会为您自动取消引用:
basic_action sp = ActionsList.front();
是对的。