继承PortableServer::RefCountServantBase时出现编译错误
我正在开发一个 corba 应用程序,在 create_servant() 方法中我们创建新的servant并将其返回给被调用者。为了使内存管理更容易,我将 PortableServer::RefCountServantBase 类继承到实现类。
我收到以下编译错误。
“simples.cpp”,第 108 行:错误:无法为抽象类 Simple_i 创建变量。
“simples.cpp”,第 108 行:错误:PortableServer::ServantBase::invoke(CORBA::ServerRequest*) 尚未被覆盖。
“simples.cpp”,第 108 行:错误:PortableServer::ServantBase::_primary_interface(const PortableServer::ObjectId&, PortableServer::POA*) 尚未被覆盖。
3 检测到错误。
如果我不继承 RefCountServantBase,我不会收到任何编译错误。在samples.cpp(此处未显示)中,我们正在创建sample_i 的实例并返回它。
这是示例代码:
//sample_i.h
#include "simple_s.h"
extern char* generate_unique_id(); // Generate unique uuids
class Simple_i : public virtual POA_Simple
, virtual public PortableServer::RefCountServantBase
{
public:
virtual char* to_lower(const char* val);
virtual void to_upper(char*& val);
virtual char* to_print(const char* val);
};
class SimpleFactory_i : public virtual POA_SimpleFactory
// , virtual public PortableServer::RefCountServantBase
{
public:
virtual Simple_ptr find_simple();
// To make simpapp scalable have the SimpleFactory use the user
// supplied identifier in the Simple object reference it creates.
};
========================================= =========================================== //sample_s.h
#include <string.h>
#include "orbminor.h"
#include <Tobj_ServantBase.h>
#include "simple_c.h"
class POA_Simple : public Tobj_ServantBase
{
public:
virtual ::CORBA::Char * to_lower (
const char * str) = 0;
virtual void to_upper (
::CORBA::Char *& str) = 0;
virtual ::CORBA::Char * to_print (
const char * str) = 0;
::Simple_ptr _this();
void invoke (::CORBA::ServerRequest_ptr _nasreq);
::CORBA::RepositoryId _primary_interface (
const PortableServer::ObjectId &,
PortableServer::POA_ptr);
protected:
virtual ~POA_Simple(){ }
private:
OBBArgument *getparams (::CORBA::Short, OBB::ServerRequest * SrvReq, ::CORBA::ULong & ArgCnt);
};
class POA_SimpleFactory : public Tobj_ServantBase
{
public:
virtual ::Simple_ptr find_simple () = 0;
::SimpleFactory_ptr _this();
void invoke (::CORBA::ServerRequest_ptr _nasreq);
::CORBA::RepositoryId _primary_interface (
const PortableServer::ObjectId &,
PortableServer::POA_ptr);
protected:
virtual ~POA_SimpleFactory(){ }
private:
OBBArgument *getparams (::CORBA::Short, OBB::ServerRequest * SrvReq, ::CORBA::ULong & ArgCnt);
};
#endif
更新: 我更改了继承,但没有继承 PortableServer::RefCountServantBase,因为 RefCountServantBase 本身被 Tobj_ServantBase 继承。
现在,我的代码如下。这样可以吗?我需要关心内存管理吗 这里 ?或者我错过了什么?
Tobj_Servant Server::create_servant(const char* intf_repos_id)
{
Tobj_Servant servant = NULL;
if (!strcmp(intf_repos_id, _tc_SimpleFactory->id())) {
servant = new SimpleFactory_i();
}
if (!strcmp(intf_repos_id, _tc_Simple->id())) {
servant = new Simple_i();
}
servant->_add_ref();
return servant; // unknown interface
}
I am working on a corba application where in create_servant() method we are creating new servant and returning it to the callee. To make the memory management easier, I am inheriting PortableServer::RefCountServantBase class to the implementation class.
I get the below compilation errors.
"simples.cpp", line 108: Error: Cannot create a variable for abstract class Simple_i.
"simples.cpp", line 108: Error: PortableServer::ServantBase::invoke(CORBA::ServerRequest*) has not been overridden.
"simples.cpp", line 108: Error: PortableServer::ServantBase::_primary_interface(const PortableServer::ObjectId&, PortableServer::POA*) has not been overridden.
3 Error(s) detected.
If I don't inherit RefCountServantBase I don't get any compilation errors. In samples.cpp, which is not shown here we are creating an instance of sample_i and returning it.
Here is the sample code:
// sample_i.h
#include "simple_s.h"
extern char* generate_unique_id(); // Generate unique uuids
class Simple_i : public virtual POA_Simple
, virtual public PortableServer::RefCountServantBase
{
public:
virtual char* to_lower(const char* val);
virtual void to_upper(char*& val);
virtual char* to_print(const char* val);
};
class SimpleFactory_i : public virtual POA_SimpleFactory
// , virtual public PortableServer::RefCountServantBase
{
public:
virtual Simple_ptr find_simple();
// To make simpapp scalable have the SimpleFactory use the user
// supplied identifier in the Simple object reference it creates.
};
================================================================================
// sample_s.h
#include <string.h>
#include "orbminor.h"
#include <Tobj_ServantBase.h>
#include "simple_c.h"
class POA_Simple : public Tobj_ServantBase
{
public:
virtual ::CORBA::Char * to_lower (
const char * str) = 0;
virtual void to_upper (
::CORBA::Char *& str) = 0;
virtual ::CORBA::Char * to_print (
const char * str) = 0;
::Simple_ptr _this();
void invoke (::CORBA::ServerRequest_ptr _nasreq);
::CORBA::RepositoryId _primary_interface (
const PortableServer::ObjectId &,
PortableServer::POA_ptr);
protected:
virtual ~POA_Simple(){ }
private:
OBBArgument *getparams (::CORBA::Short, OBB::ServerRequest * SrvReq, ::CORBA::ULong & ArgCnt);
};
class POA_SimpleFactory : public Tobj_ServantBase
{
public:
virtual ::Simple_ptr find_simple () = 0;
::SimpleFactory_ptr _this();
void invoke (::CORBA::ServerRequest_ptr _nasreq);
::CORBA::RepositoryId _primary_interface (
const PortableServer::ObjectId &,
PortableServer::POA_ptr);
protected:
virtual ~POA_SimpleFactory(){ }
private:
OBBArgument *getparams (::CORBA::Short, OBB::ServerRequest * SrvReq, ::CORBA::ULong & ArgCnt);
};
#endif
Update:
I changed the inheritance and did not inherit PortableServer::RefCountServantBase, since RefCountServantBase itself is getting inherited by Tobj_ServantBase.
Now, I have the code as below. Is this fine? Do I need to care about memory management
here ? Or am I missing something?
Tobj_Servant Server::create_servant(const char* intf_repos_id)
{
Tobj_Servant servant = NULL;
if (!strcmp(intf_repos_id, _tc_SimpleFactory->id())) {
servant = new SimpleFactory_i();
}
if (!strcmp(intf_repos_id, _tc_Simple->id())) {
servant = new Simple_i();
}
servant->_add_ref();
return servant; // unknown interface
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在较新版本的 CORBA 中,不推荐使用 RefCountServantBase。您不再需要继承它,因为自动生成的 C++ 仆人现在提供相同的功能。您应该验证您正在使用的 ORB 是否已实现此更改。
至于您关于
create_servant()
函数的问题部分。从创造仆人的角度来看应该没问题。然而,您可以将多个内容分配给您的servant 变量,这看起来很奇怪。如果发生这种情况,你就会泄漏。我也不能说
_tc_SimpleFactory->id()
或_tc_Simple->id()
因为我不熟悉这些函数。如果它们返回 CORBA 字符串,那么您就会泄漏内存。In newer versions of CORBA, RefCountServantBase is deprecated. You no longer need to inherit from it because the auto-generated C++ servants now provide the same functionality. You should verify that the ORB you are using has implemented this change.
As to the part of your question about your
create_servant()
function. It should be fine from the servant creation aspect. However it looks strange that you can assign multiple things to yourservant
variable. If this happened you would leak.I also can't say about
_tc_SimpleFactory->id()
or_tc_Simple->id()
because I'm not familiar with those functions. If they return CORBA strings then you are leaking memory.PortableServer::RefCountServantBase 是抽象类吗?你能发布它的声明吗?
第一个编译错误表明 Simple_i 没有实现基类中声明的所有抽象方法。
另外两个编译错误涉及 PortableServer::ServantBase 中未在 Simple_i 中实现的方法。我猜它们是抽象方法。我还注意到其中一个称为调用,并且 POA_Simple 声明了一个调用方法。也就是说,Simple_i 继承了两个不同基类调用的调用方法。我不确定这是否会导致进一步的问题。
Is PortableServer::RefCountServantBase an abstract class? Could you post its declaration?
First compilation error says Simple_i is not implementing all the abstract methods declared in the base classes.
The other two compilation errors refer to methods in PortableServer::ServantBase that are not being implemented in Simple_i. I guess they are abstract methods. I note also that one of them is called invoke, and that POA_Simple declares an invoke method. That is, Simple_i is inheriting a method called invoke by two different base classes. I am not sure if this can lead to further issues.