C++ 对象类型之间的转换
我想做的是:C++ 对象类型之间的转换,c++,eclipse-cdt,C++,Eclipse Cdt,我想做的是: void startApp() { //create validator MedValidator* val = new MedValidator(); //create reporsitory MedicineRepository* repo= new MedRepo() ; //create controller Control wh(repo, val); ...}
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;
};
如何解决此问题?我希望代码量足够,如果需要更多,我将添加。控件的构造函数采用
MedRepo*
参数:
Control(MedRepo* repo, MedValidator* validator);};
但是您正在传递一个MedicineRepository*
:
MedicineRepository* repo= new MedRepo() ;
//create controller
Control wh(repo, val);
另外,不要使用异常规范,它们是。您的问题是MedRepo是一个MedicineRepository,但MedicineRepository不是一个MedRepo。在需要派生类对象的情况下,不能替换基类对象,只能替换相反的(无论如何,安全地)。您需要弄清楚是否需要指向该特定派生类的指针,或者是否可以使用指向任何派生类的指针。对于前者,保持代码的原样,并向其发送一个MedRepo对象。如果任何派生类都可以(即,您只访问基类中的方法),则更改控件以接受基类。Ok,但如果我将它们切换到
MedRepo*repo=new MedicineRepository()代码>我收到一个新错误从“MedicineRepository*”到“MedRepo*”[-fppermissive]
的无效转换,同时MedicineRepository*repo=new MedRepo()
很好,因为MedicineRepository
是MedRepo
的基类,MedRepo*repo=new MedicineRepository()
并不是因为没有从MedicineRepository
到MedRepo
的隐式转换。所以我们要告诉我的是修改`控制(MedRepo*repo,MedValidator*validator);` 在对照组(MedicineRepository*repo、MedValidator*validator)代码>,对吗?如果您的目标是控制
使用MedicineRepository
的界面,那么这样做是解决此问题的一个好方法。这样,您仍然可以传递从MedicineRepository
派生的类型,例如MedRepo
,这些类型以不同的方式实现成员函数。
MedicineRepository* repo= new MedRepo() ;
//create controller
Control wh(repo, val);