gpt4 book ai didi

c++ - boost::ptr_container 中的克隆分配器和多态性

转载 作者:搜寻专家 更新时间:2023-10-31 01:53:52 24 4
gpt4 key购买 nike

对于我当前的项目,我使用 boost::ptr_vector 以多态方式保存 Objects,并且一切正常,直到我的一个构建 VS2010 抛出它可以不克隆 object 所以我去了,查找克隆,并按照 boost 的要求实现了 new_clone() 方法,并遵循 c++ FAQ使其成为纯虚拟,但现在 VS2010 向我抛出这个 shanagin 说它不能在抽象类上使用克隆。

1>c:\program files\boost\boost_1_49_0\boost\ptr_container\clone_allocator.hpp(34): error C2259: 'Object' : cannot instantiate abstract class
1> due to following members:
1> 'Object *Object::new_clone(void) const' : is abstract
1> c:\...\Object.h(36) : see declaration of 'Object::new_clone'
1> c:\program files\boost\boost_1_49_0\boost\ptr_container\clone_allocator.hpp(68) : see reference to function template instantiation 'T *boost::new_clone<U>(const T &)' being compiled
1> with
1> [
1> T=Object,
1> U=Object
1> ]
1> c:\program files\boost\boost_1_49_0\boost\ptr_container\detail\reversible_ptr_container.hpp(110) : see reference to function template instantiation 'U *boost::heap_clone_allocator::allocate_clone<Object>(const U &)' being compiled
1> with
1> [
1> U=Object
1> ]
1> c:\program files\boost\boost_1_49_0\boost\ptr_container\detail\reversible_ptr_container.hpp(99) : while compiling class template member function 'Object *boost::ptr_container_detail::reversible_ptr_container<Config,CloneAllocator>::null_clone_allocator<allow_null_values>::allocate_clone(const Object *)'
1> with
1> [
1> Config=boost::ptr_container_detail::sequence_config<Object,std::vector<void *,std::allocator<void *>>>,
1> CloneAllocator=boost::heap_clone_allocator,
1> allow_null_values=false
1> ]
1> c:\program files\boost\boost_1_49_0\boost\ptr_container\detail\reversible_ptr_container.hpp(276) : see reference to class template instantiation 'boost::ptr_container_detail::reversible_ptr_container<Config,CloneAllocator>::null_clone_allocator<allow_null_values>' being compiled
1> with
1> [
1> Config=boost::ptr_container_detail::sequence_config<Object,std::vector<void *,std::allocator<void *>>>,
1> CloneAllocator=boost::heap_clone_allocator,
1> allow_null_values=false
1> ]
1> c:\program files\boost\boost_1_49_0\boost\ptr_container\detail\reversible_ptr_container.hpp(275) : while compiling class template member function 'void boost::ptr_container_detail::reversible_ptr_container<Config,CloneAllocator>::null_policy_deallocate_clone(const Object *)'
1> with
1> [
1> Config=boost::ptr_container_detail::sequence_config<Object,std::vector<void *,std::allocator<void *>>>,
1> CloneAllocator=boost::heap_clone_allocator
1> ]
1> c:\program files\boost\boost_1_49_0\boost\ptr_container\ptr_sequence_adapter.hpp(132) : see reference to class template instantiation 'boost::ptr_container_detail::reversible_ptr_container<Config,CloneAllocator>' being compiled
1> with
1> [
1> Config=boost::ptr_container_detail::sequence_config<Object,std::vector<void *,std::allocator<void *>>>,
1> CloneAllocator=boost::heap_clone_allocator
1> ]
1> c:\program files\boost\boost_1_49_0\boost\ptr_container\ptr_vector.hpp(35) : see reference to class template instantiation 'boost::ptr_sequence_adapter<T,VoidPtrSeq,CloneAllocator>' being compiled
1> with
1> [
1> T=Object,
1> VoidPtrSeq=std::vector<void *,std::allocator<void *>>,
1> CloneAllocator=boost::heap_clone_allocator
1> ]
1> c:\general\dev\senior\tankbattle3d\tankbattle3d\tankbattle3d\room.h(28) : see reference to class template instantiation 'boost::ptr_vector<T>' being compiled
1> with
1> [
1> T=Object
1> ]

这是否意味着为了让 boost 能够克隆我必须丢弃抽象基类的东西?


注意事项:

  • 抽象基类的对象在任何时候都不应存在于程序中,但几乎所有内容都将被如此对待。
  • 当我使克隆方法成为非虚拟的,并赋予它实际返回某些东西的方法时(提供一个构造函数/复制构造函数,这意味着它们可能存在,这违反了设计)然后编译器抛出所有的 dirived类需要默认构造函数。没有它们是设计使然。

编辑:我没有实现 delete_clone()(没有意识到这是明确要求的,我认为析构函数会很好)

class Object{
public :
ObjectType superType;
bool toBeRemoved;
virtual void performAction(int action, Object& source){}
virtual void updateObject(float duration){}
virtual ~Object(){}
virtual Object * new_clone(void)const = 0; // Object.h[36]
bool operator==(const Object& _other)const;
bool operator!=(const Object& _other)const;
};

最佳答案

你要的是独立的(非成员(member))new_clone()编译器优先选择 Boost 的 clone_allocator.hpp 中的函数:

class Object{
public :
ObjectType superType;
bool toBeRemoved;
virtual void performAction(int action, Object& source){}
virtual void updateObject(float duration){}
virtual ~Object(){}
bool operator==(const Object& _other)const;
bool operator!=(const Object& _other)const;

private:
virtual Object * do_clone() const = 0;
};

// in the same namespace as `class Object`:
// so it will get picked up instead of Boost's default
// implementation

inline
Object* new_clone( const Object& o)
{
return o.do_clone();
}

关于c++ - boost::ptr_container 中的克隆分配器和多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10475509/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com