对象类型之间的转换

时间:2013-05-21 19:40:57

标签: c++ eclipse-cdt

我正在尝试做什么:

void startApp() {
            //create validator
        MedValidator* val = new MedValidator();
        //create reporsitory
        MedicineRepository* repo= new MedRepo() ;
        //create controller
        Control wh(repo, val);
    ...}

以下是使用类型的视图:

 class MedValidator
    {
    public:
        void validate(const Medicine& s) throw(MedException);
    };


class MedicineRepository
{
public: virtual void addMed(Medicine s) ;
};

class MedRepo : public MedicineRepository{
public:void addMed(Medicine s);
protected:
    Vector<Medicine*> MedList;
};

当我宣布Multiple markers at this line - candidates are: - no matching function for call to 'Control::Control(MedicineRepository&, MedValidator*&)'时,我startApp() wh

class Control {
public:
    Control(MedRepo* repo, MedValidator* validator);};

我该如何解决这个问题?我希望代码量足够,如果需要更多我会添加。

2 个答案:

答案 0 :(得分:0)

Control的构造函数采用MedRepo*参数:

Control(MedRepo* repo, MedValidator* validator);};

但是你传递的是MedicineRepository*

 MedicineRepository* repo= new MedRepo() ;
 //create controller
 Control wh(repo, val);

另外,不要使用例外规范,它们是bad

答案 1 :(得分:0)

您的问题是MedRepo是一个MedicineRepository,但MedicineRepository不是MedRepo。您不能替换期望派生类对象的基类对象,只能反向(安全地,无论如何)。您需要弄清楚是否需要指向特定派生类的指针,或者指向任何派生类的指针是否正常。对于前者,请保留您的代码,并将其发送给MedRepo对象。如果任何派生类都会这样做(即你只是从基类访问方法),那么改为Control来接受基类。