مشكلة C ++ الدرجة الميراث
-
20-09-2019 - |
سؤال
ومرحبا لدي فئتين، واحدة تسمى التعليمات، واحدة تسمى LDI الذي يرث من الفئة التعليمات.
class Instruction{
protected:
string name;
int value;
public:
Instruction(string _name, int _value){ //constructor
name = _name;
value = _value;
}
~Instruction(){}
Instruction (const Instruction &rhs){
name = rhs.name;
value = rhs.value;
}
void setName(string _name){
name = _name;
}
void setValue(int _value){
value = _value;
}
string getName(){
return name;
}
int getValue(){
return value;
}
virtual void execute(){}
virtual Instruction* Clone() {
return new Instruction(*this);
}
};
/////////////end of instruction super class //////////////////////////
class LDI : public Instruction{
void execute(){
//not implemented yet
}
virtual Instruction* Clone(){
return new LDI(*this);
}
};
وبعد ذلك يمكنني إنشاء مؤشر من نوع والتعليم، ومحاولة للتأكد أشر إلى مثيل جديد من نوع LDI.
Instruction* ptr;
ptr = new LDI("test", 22);
وأحصل على أخطاء مترجم التالية. أي أفكار ما أفعله خطأ؟
functions.h:71: error: no matching function for call to ‘LDI::LDI(std::string&, int&)’
classes.h:54: note: candidates are: LDI::LDI()
classes.h:54: note: LDI::LDI(const LDI&)
المحلول
والرمز: new LDI(name, val)
يقول على وجه التحديد ". اتصل منشئ LDI مع name
وval
"
وليس هناك منشئ LDI أن يأخذ name / val
.
في الواقع، أنا لا أرى منشئ للLDI على الإطلاق.
إذا كنت تريد استخدام منشئ على مستوى القاعدة، وهنا هو كيف:
public LDI(string _name, int _value) // Public constructor for LDI
: Instruction(_name, _value) // Delegate to the base-class constructor
{
// Do more LDI-specific construction here
}
نصائح أخرى
LDI::LDI (string _name, int _value):Instruction(_name,_value){}
وتحتاج إلى توفير منشئ للLDI
فئة مشتقة، وهذا بدوره يدعو الصحيح منشئ فئة قاعدة.
ptr = new LDI("test", 22);
في هذه اللحظة يبدو مترجم للمنشئ LDI
التي تأخذ (string,int)
كوسائط، لأنه ليس هناك تقدم لا يوجد مثل هذا منشئ أسرة مترجم.
LDI(string _name, int _value)
{
}
ومن خلال توفير منشئ فئة مشتقة لن تحل قضية تجميع. ولكن افتراضيا سوف منشئ فئة مشتقة لم يدع مناسبة منشئ الفئة الأساسية. في هذه الحالة Instruction(_name,_value)
(أنه يدعو فقط منشئ افتراضي).
من أجل الدعوة الصحيح منشئ فئة أساسية تحتاج إلى استدعاء منشئ الفئة الأساسية من فئة مشتقة مهيئ القائمة.
وهكذا.
LDI::LDI (string _name, int _value):Instruction(_name,_value){}
والبنائون، تالفة، عامل التعيين، وظائف صديق والطبقات صديق من الفئات الأساسية التي كتبها الفئات المشتقة منها.
والتنوب جميع يجب عليك تعريف ومنشئ تعلن عن LDI (_name سلسلة، _value كثافة العمليات). MYST يمكنك تهيئة قاعدة الخاص بك منشئ فئة أيضا LDI :: LDI (_name سلسلة، _value دولية): التدريس (_name، _value) {}. ثانيا سيكون من الجيد إذا إضافة vritual الكلمة بك قبل المدمر الفئة الأساسية. إذا كان لديك الفئة الأساسية المدمر لا الظاهري وتكتب هذا الرمز تعليمات * PTR. PTR = LDI الجديد ( "اختبار"، 22)؛ حذف PTR *؛
والمدمر لLDI دعا أبدا. الحفاظ المدمر الفئة الأساسية الظاهري لتصحيح تدمير للالتسلسل الهرمي الخاص بك من الأشياء