继承 PortableServer::RefCountServantBase 时的编译错误

Posted

技术标签:

【中文标题】继承 PortableServer::RefCountServantBase 时的编译错误【英文标题】:Compilation errors when inheriting PortableServer::RefCountServantBase 【发布时间】:2010-06-22 22:35:59 【问题描述】:

我正在开发一个 corba 应用程序,我们在 create_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

【问题讨论】:

这是我们使用的 TUX ORB。 【参考方案1】:

在较新版本的 CORBA 中,不推荐使用 RefCountServantBase。您不再需要从它继承,因为自动生成的 C++ 仆人现在提供相同的功能。您应该验证您正在使用的 ORB 是否已实现此更改。

关于您的 create_servant() 函数的部分问题。从仆人创建方面应该没问题。但是,您可以将多个内容分配给您的 servant 变量,这看起来很奇怪。如果发生这种情况,您会泄漏。

我也不能说_tc_SimpleFactory-&gt;id()_tc_Simple-&gt;id() 因为我不熟悉这些功能。如果它们返回 CORBA 字符串,那么您就是在泄漏内存。

【讨论】:

知道了。条件应该是 else if 而不是 ifs。这就是你所说的内存泄漏吗?总之谢谢。如果 ORB 已经进行了更改,我会查看它。 是的,如果这两个 if 都被执行了,你就会泄漏。还要注意那些对_tc_SimpleFactory-&gt;id()_tc_Simple-&gt;id() 的调用。他们是否返回了您必须释放自己的字符串?如果是这样,那也是泄漏。【参考方案2】:

PortableServer::RefCountServantBase 是一个抽象类吗?你能发布它的声明吗?

第一个编译错误说 Simple_i 没有实现基类中声明的所有抽象方法。 其他两个编译错误是指 PortableServer::ServantBase 中未在 Simple_i 中实现的方法。我猜它们是抽象方法。我还注意到其中之一称为调用,并且 POA_Simple 声明了调用方法。也就是说,Simple_i 继承了一个由两个不同的基类调用的方法。我不确定这是否会导致更多问题。

【讨论】:

我用 Binged/google 搜索并没有找到 RefCountServantBase 的类声明:-( . 你应该有它的来源。

以上是关于继承 PortableServer::RefCountServantBase 时的编译错误的主要内容,如果未能解决你的问题,请参考以下文章

什么是多重继承,单重继承?

python 单继承多继承菱形继承

JSJavaScript继承 - 原型链 - 盗用构造函数 - 组合继承 -原型式继承 - 寄生式继承 - 寄生式组合继承

C++之继承总结(继承的定义与格式,赋值转换,默认成员函数,菱形继承及菱形虚拟继承)

c++继承汇总(单继承多继承虚继承菱形继承)

C++继承汇总(单继承多继承虚继承菱形继承)