سؤال

ومرحبا لدي فئتين، واحدة تسمى التعليمات، واحدة تسمى 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 دعا أبدا. الحفاظ المدمر الفئة الأساسية الظاهري لتصحيح تدمير للالتسلسل الهرمي الخاص بك من الأشياء

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top