سؤال

هذا واحد لي الحيرة.ما أحاول القيام به هو الحصول على متغير مرجعي في فئة المجمع للإشارة إلى كائن بنية في الفئة التي يلتف بحيث أي إعداد المتغيرات في البنية من الفئات الأخرى التي تستخدم فئة المجمع ، في الواقع يتم تعيين في فئة ملفوفة وليس فئة ورابر.للقيام بذلك حاولت ببساطة إنشاء مرجع في فئة التفاف إلى البنية في فئة ملفوفة مثل

class CClassWrap
{
    CClass::plot_type& PlotArgs;  
}  

ثم الحرف الأول بلوتارغس

CClassWrap::InitWrap( CClass AppIfx )
{
    PlotArgs = AppIfx.PlotArgs;
}

أريد فقط بلوتارغس للإشارة إلى بلوتارغس الطبقة ملفوفة بحيث عندما يتم الوصول بلوتارغس من يقول هذا

class StudiesBase:public CClassWrap
{
   //12 should show up in CClass because PlotArgs in CClassWrap points to the PlotArgs on CClass.
   PlotArgs.value = 12;

 }

12 يظهر في نسخة الطبقات ملفوفة من بلوتارغس.للقيام بذلك حاولت وضع مرجع محدد في .ح الملف على النحو التالي

#include "CClass.h"

class CClassWrap
{
 //PlotArgs is a struct with a few vars in it (int, long, etc.) that exists in CClass
 CClass::plot_type& PlotArgs;  
}

يتم توريث كلاسوراب في فئة أخرى ، نسميها ستوديسباس

class StudiesBase:: public CClassWrap
{
     etc...
}

عندما يتم تجميع هذا ، يتم إعطاء خطأ قائلا لا يوجد كتور الافتراضي ل كلاسوراب.لذلك أود أن أضيف كتور

مثل هذا كلاسوراب يبدو الآن مثل

class CClassWrap
{
public:
      CClassWrap();
public:
     //PlotArgs is a struct with a few vars in it (int, long, etc.) that exists in CClass
     CClass::plot_type& PlotArgs;  
}

هذا يولد خطأ ج 2758 قائلا أن بلوتارغس ليست إينيتتيتاليزد.

حتى في كتور ل كلاسوراب أحاول أن إينت ذلك.

PlotArgs = AppIfx.PlotArgs;

حيث يتم تعيين أبيفكس في وقت التشغيل كمؤشر إلى كائن كلاس.لا يحب المترجم ذلك إما مع الخطأ ج 2758 يجب أن يكون المتغير إنيتيالزيد في قائمة منشئ قاعدة/عضو مهيئ الخ...

إذا بدا أنني أحاول القيام بشيء ما ، فأنا واضح تماما بشأن كيفية القيام بذلك ، فسيكون هذا هو الحال بالتأكيد!أي مساعدة سيكون موضع تقدير كبير.

هل كانت مفيدة؟

المحلول

هذا هو المكان الذي أخطأت فيه

CClassWrap::InitWrap( CClass AppIfx )
{
    PlotArgs = AppIfx.PlotArgs;
}

لا يمكنك إعادة ربط مرجع.بمجرد أن تشير الإشارة إلى شيء ما ، لا يمكن أبدا الإشارة إلى شيء آخر.سيتم تعيين هذا الرمز (إذا قمت بتنفيذه) AppIfx.PlotArgs إلى أي شيء PlotArgs أشار إلى, من الواضح أن هذا ليس ما كنت تقصده.

يجب نقل هذا الرمز إلى المنشئ

CClassWrap::CClassWrap( CClass AppIfx ) : PlotArgs(AppIfx.PlotArgs)
{
}

ولكن لاحظ أيضا أن رمز المنشئ هذا ينسخ كائن كلاس ، لذلك قد لا يفعل ما تتوقعه (قد ينتهي بك الأمر إلى الرجوع إلى كائن بلوتارغس المنسوخ ، على الرغم من أن ذلك يعتمد على كيفية عمل منشئ نسخة كلاس).لذلك ربما يكون من الأفضل استخدام مرجع هنا أيضا

CClassWrap::CClassWrap( CClass& AppIfx ) : PlotArgs(AppIfx.PlotArgs)
{
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top