在构造函数处将类对象强制转换为接口始终返回 NULL

Cast a class object into an interface at constructor always returns NULL

本文关键字:接口 NULL 返回 转换 构造函数 对象      更新时间:2023-10-16

我的使用接口,如果在对象创建中使用了接口,则需要信息:

界面:

class IServerSetup {
public:
virtual void ServerSetup () = 0;
}

班级:

class MyServer : public MqC, public IServerSetup {                                                                 
public:
MyServer(MqS *tmpl) : MqC(tmpl) {};                                                                            
private:
// service to serve all incomming requests for token "HLWO"                                                    
void MyFirstService () { 
SendSTART();
SendC("Hello World");                                                                                        
SendRETURN();
}
// define a service as link between the token "HLWO" and the callback "MyFirstService"                         
void ServerSetup() {                                                                                           
ServiceCreate("HLWO", CallbackF(&MyServer::MyFirstService));                                                 
}                                                                                                              
};                                                                                                                 

MqC的构造函数:

MqC::MqC (struct MqS *tmpl) {                                                                          
if (tmpl && (*(int*)tmpl) != MQ_MqS_SIGNATURE) {                                                             
throw MqCSignatureException("MqS");                                                                        
} else {
hdl = MqContextCreate(0, tmpl);                                                                            
MqConfigSetSelf (hdl, this);                                                                               
this->objInit();    <<<<<<<<<<<< This is the important part…                                                                                     
}                                                                                                            
}

现在objInit()应该检测接口以正确配置对象......

void MqC::objInit () {
// use "hdl->setup.Parent.fCreate" to ckeck in context was initialized
if (hdl->setup.Parent.fCreate != NULL) return;
hdl->setup.Parent.fCreate = MqLinkDefault;
hdl->setup.Child.fCreate = MqLinkDefault;
// init the server interface
IServerSetup * const iSetup = dynamic_cast<IServerSetup*const>(this);
if (iSetup != NULL) {
struct ProcCallS * ptr = (struct ProcCallS *) MqSysMalloc(MQ_ERROR_PANIC, sizeof(*ptr));
ptr->type = ProcCallS::PC_IServerSetup;
ptr->call.ServerSetup = iSetup;
MqConfigSetServerSetup (hdl, ProcCall, static_cast<MQ_PTR>(ptr), ProcFree, ProcCopy);
}
...

简而言之...该行:

IServerSetup * const iSetup = dynamic_cast<IServerSetup*const>(this);

在构造函数中不起作用(返回总是NULL(...所以我需要稍后打电话给objInit()...这不好

更新

如果我在顶级构造函数中使用objInit...这行得通...

→但是有没有可能避免这种情况(总是重复objInit()(......并在MqC构造函数中获取顶级对象?

MyServer(MqS *tmpl) : MqC(tmpl) {                                                                              
objInit();                                                                                                   
};                                                                                                             

Invoid MqC::objInit ()*this是一个MqC.MqCIServerSetup没有关系,因此试图将其转换为一个是行不通的。