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

时间:2010-06-22 22:36:00

标签: c++ corba

我正在开发一个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
}

2 个答案:

答案 0 :(得分:0)

PortableServer :: RefCountServantBase是抽象类吗?你能发表声明吗?

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

答案 1 :(得分:0)

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

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

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