From 7c68726716dcfa0f333693046e5d51c71c367dbc Mon Sep 17 00:00:00 2001 From: Jose Luis Blanco Claraco Date: Tue, 21 Nov 2017 01:09:21 +0100 Subject: [PATCH] Fix bug in refactored RTTI subsystem There was a missing static getter in the macro for virtual base classes. Closes #614 --- libs/base/include/mrpt/utils/CObject.h | 85 ++++++++++++++------------ 1 file changed, 45 insertions(+), 40 deletions(-) diff --git a/libs/base/include/mrpt/utils/CObject.h b/libs/base/include/mrpt/utils/CObject.h index 82c694f787..c56697dd47 100644 --- a/libs/base/include/mrpt/utils/CObject.h +++ b/libs/base/include/mrpt/utils/CObject.h @@ -183,31 +183,32 @@ inline mrpt::utils::CObject::Ptr CObject::duplicateGetSmartPtr() const /** This declaration must be inserted in all CObject classes definition, within * the class declaration. */ -#define DEFINE_MRPT_OBJECT(class_name) \ - /*! @name RTTI stuff */ \ - /*! @{ */ \ - protected: \ - static const mrpt::utils::TRuntimeClassId* _GetBaseClass(); \ - static mrpt::utils::CLASSINIT _init_##class_name; \ - static const mrpt::utils::TRuntimeClassId runtimeClassId; \ - public: \ - /*! A typedef for the associated smart pointer */ \ - using Ptr = std::shared_ptr; \ - using ConstPtr = std::shared_ptr; \ - static constexpr const char* className = #class_name; \ - static const mrpt::utils::TRuntimeClassId& GetRuntimeClassIdStatic(); \ - static const mrpt::utils::TRuntimeClassId* classinfo; \ - virtual const mrpt::utils::TRuntimeClassId* GetRuntimeClass() const override; \ - static mrpt::utils::CObject* CreateObject(); \ - virtual mrpt::utils::CObject* clone() const override; \ - template \ - static Ptr Create(Args&&... args) \ - { \ - return mrpt::make_aligned_shared( \ - std::forward(args)...); \ - } \ - /*! @} */ \ - public: \ +#define DEFINE_MRPT_OBJECT(class_name) \ + /*! @name RTTI stuff */ \ + /*! @{ */ \ + protected: \ + static const mrpt::utils::TRuntimeClassId* _GetBaseClass(); \ + static mrpt::utils::CLASSINIT _init_##class_name; \ + static const mrpt::utils::TRuntimeClassId runtimeClassId; \ + \ + public: \ + /*! A typedef for the associated smart pointer */ \ + using Ptr = std::shared_ptr; \ + using ConstPtr = std::shared_ptr; \ + static constexpr const char* className = #class_name; \ + static const mrpt::utils::TRuntimeClassId& GetRuntimeClassIdStatic(); \ + virtual const mrpt::utils::TRuntimeClassId* GetRuntimeClass() \ + const override; \ + static mrpt::utils::CObject* CreateObject(); \ + virtual mrpt::utils::CObject* clone() const override; \ + template \ + static Ptr Create(Args&&... args) \ + { \ + return mrpt::make_aligned_shared( \ + std::forward(args)...); \ + } \ + /*! @} */ \ + public: \ MRPT_MAKE_ALIGNED_OPERATOR_NEW /** This must be inserted in all CObject classes implementation files @@ -229,8 +230,6 @@ inline mrpt::utils::CObject::Ptr CObject::duplicateGetSmartPtr() const const mrpt::utils::TRuntimeClassId NameSpace::class_name::runtimeClassId = \ {#class_name, NameSpace::class_name::CreateObject, \ &class_name::_GetBaseClass}; \ - const mrpt::utils::TRuntimeClassId* NameSpace::class_name::classinfo = \ - &NameSpace::class_name::runtimeClassId; \ const mrpt::utils::TRuntimeClassId* \ NameSpace::class_name::GetRuntimeClass() const \ { \ @@ -247,19 +246,20 @@ inline mrpt::utils::CObject::Ptr CObject::duplicateGetSmartPtr() const /** This declaration must be inserted in virtual CSerializable classes * definition: */ -#define DEFINE_VIRTUAL_MRPT_OBJECT(class_name) \ - /*! @name RTTI stuff */ \ - /*! @{ */ \ - protected: \ - static const mrpt::utils::TRuntimeClassId* _GetBaseClass(); \ - static const mrpt::utils::TRuntimeClassId runtimeClassId; \ - \ - public: \ - using Ptr = std::shared_ptr; \ - using ConstPtr = std::shared_ptr; \ - virtual const mrpt::utils::TRuntimeClassId* GetRuntimeClass() \ - const override; \ - friend class mrpt::utils::CStream; \ +#define DEFINE_VIRTUAL_MRPT_OBJECT(class_name) \ + /*! @name RTTI stuff */ \ + /*! @{ */ \ + protected: \ + static const mrpt::utils::TRuntimeClassId* _GetBaseClass(); \ + static const mrpt::utils::TRuntimeClassId runtimeClassId; \ + \ + public: \ + using Ptr = std::shared_ptr; \ + using ConstPtr = std::shared_ptr; \ + virtual const mrpt::utils::TRuntimeClassId* GetRuntimeClass() \ + const override; \ + static const mrpt::utils::TRuntimeClassId& GetRuntimeClassIdStatic(); \ + friend class mrpt::utils::CStream; \ /*! @} */ /** This must be inserted as implementation of some required members for @@ -275,6 +275,11 @@ inline mrpt::utils::CObject::Ptr CObject::duplicateGetSmartPtr() const const mrpt::utils::TRuntimeClassId* class_name::GetRuntimeClass() const \ { \ return CLASS_ID(class_name); \ + } \ + const mrpt::utils::TRuntimeClassId& \ + NameSpace::class_name::GetRuntimeClassIdStatic() \ + { \ + return NameSpace::class_name::runtimeClassId; \ } /** @} */ // end of RTTI