لماذا لا يمكنني الوصول إلى Var عام باستخدام Getter؟
-
20-09-2019 - |
سؤال
وجود ملف يحتوي على هذه العبارات:
public:
boost::shared_ptr<TBFControl::TbfCmdHandler> _tbfCmdHandlerPtr;
// will be private later...
boost::shared_ptr<TBFControl::TbfCmdHandler> getTBFCmdHandler()
{ return _tbfCmdHandlerPtr; }
يمكنني استخدامه بهذه الطريقة:
boost::shared_ptr<TBFControl::TbfCmdHandler>myTbfCmdHandlerPtr(
this->getTBFInstallation()-> _tbfCmdHandlerPtr );
لكن ليس ، كما أريد ، بهذه الطريقة:
boost::shared_ptr<TBFControl::TbfCmdHandler>myTbfCmdHandlerPtr(
this->getTBFInstallation()->getTBFCmdHandler() );
باستخدام وظيفة getter ، يحدث الخطأ التالي:
"Housekeeping :: tbfinstallation :: gettbfcmdhandler": لا يمكن تحويل "مؤشر" من "Const Housekeeping :: tbfinstallation" إلى "التدبير المنزلي :: tbfinstallation &"
ما يحدث الخطأ هنا؟
المحلول
بوضوح، this->getTBFInstallation()
يعيد مؤشر كونست. تحتاج إلى جعل الوظيفة getTBFCmdHandler
كونست كذلك.
boost::shared_ptr<TBFControl::TbfCmdHandler> getTBFCmdHandler() const
{
return _tbfCmdHandlerPtr;
}
لاحظ ال const
الكلمة الرئيسية في نهاية السطر الأول.
يحرر: بإضافة const
, ، أنت في الواقع تغيير نوع this
من TBFInstallation *
إلى TBFInstallation const *
. في الأساس ، بإضافة const
, ، أنت تقول أنه يمكن استدعاء الوظيفة حتى عندما يكون الكائن الذي يتم استدعاء الوظيفة عليه هو const.
نصائح أخرى
getTBFInstallation()
هو (على ما يبدو) إعادة مؤشر const. لكن، getTBFCmdHandler()
هي وظيفة عضو غير مؤشر وبالتالي لا يمكن استدعاؤها على مؤشر CONC. الحل: اجعل getTBFCmdHandler()
وظيفة عضو const
دون رؤية الكود أعتقد ذلك getTBFInstallation()
إرجاع أ const TBFInstallation
التي تحاول استدعاء وظيفة غير const.