المشغل () كمرجع (C ++)
-
23-09-2019 - |
سؤال
يمكنني استخدام المشغل () كمشغل ترجمي بهذه الطريقة:
double CVector::operator() (int i) const
{
if (i >= 0 && i < this->size)
return this->data[i];
else
return 0;
}
double& CVector::operator() (int i)
{
return (this->data[i]);
}
إنه يعمل عندما أحصل على القيم ، لكنني أحصل على خطأ عندما أحاول كتابة تعيين قيمة باستخدام
a(i) = 1;
تحديث: نص الخطأ:
استثناء غير معبأ في 0x651CF54A (MSVCR100D.DLL) في CG.EXE: 0xC0000005: موقع انتهاك الوصول 0xCCCCCC0.
المحلول
كما قلت في تعليقي ، المشكلة هي تصميمك المعيب. أقوم بتقديم ضمان بنسبة 100 ٪ على أحد شيئين:
- القيمة التي تنقلها إلى وظيفة المهمة خارج نطاق صالح.
- عضو
data
يشير إلى مساحة غير صالحة في الذاكرة.
في كلتا الحالتين ، أود أن أقترح إضافة:
#include <cassert>
وإضافة assert(i >= 0 && i < this->size)
بدلا من الإخفاقات الصامتة:
double CVector::operator() (int i) const
{
assert(i >= 0 && i < this->size);
return this->data[i];
}
double& CVector::operator() (int i)
{
assert(i >= 0 && i < this->size);
return (this->data[i]);
}
نصائح أخرى
ذلك لأنك لم تنفذ معالجة الأخطاء double& CVector::operator() (int i)
كما فعلت للوظيفة الأخرى التي تتفوق على الأحمال الزائدة ()
.
تغييره إلى:
double& CVector::operator() (int i)
{
if (i >= 0 && i < this->size)
{
return this->data[i];
}
else // Whatever manner you want to gracefully exit the program
{
std::cout<<"Out of bounds!"<<endl;
exit(1);
}
}
يجب عليك أيضًا التفكير في تغيير آلية معالجة الأخطاء في الوظيفة الأخرى من return 0;
لشيء أكثر معنى.
استثناء غير معبأ في 0x651CF54A (MSVCR100D.DLL) في CG.EXE: 0xC0000005: موقع انتهاك الوصول 0xCCCCCC0.
0xcc
هي قيمة بايت الذاكرة MSVC. بمعنى آخر ، تكون مشكلتك على الأرجح بسبب الوصول إلى مؤشر غير ضروري أو مؤشر مستمد من ذاكرة غير مهتم.
المشكلة هي أنك لا تتحقق من فهرس خارج المدى في double&
نسخة من operator()
.
ربما لا يمكنك ضمان ذلك data[i]
يشير إلى عنوان ذاكرة صالح لكبير بما يكفي i
. يجب عليك إما التحقق من الفهرس خارج المدى ورمي بعض الاستثناءات أو تغيير حجم المتجه الخاص بك (عن طريق تخصيص المزيد من الذاكرة data
) لتكون قادرة على الاحتفاظ بمزيد من القيم.