Ошибки компиляции при наследовании PortableServer :: RefCountServantBase - PullRequest
0 голосов
/ 23 июня 2010

Я работаю над приложением 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
}

Ответы [ 2 ]

0 голосов
/ 05 июля 2010

В более новых версиях CORBA RefCountServantBase устарела. Вам больше не нужно наследовать от него, потому что автоматически сгенерированные слоты C ++ теперь предоставляют ту же функциональность. Вы должны убедиться, что используемый вами ORB внедрил это изменение.

Что касается части вашего вопроса о вашей create_servant() функции. Это должно быть хорошо с точки зрения создания слуги. Однако выглядит странным, что вы можете назначить несколько переменных вашей переменной servant. Если бы это случилось, вы бы пропустили.

Я также не могу сказать о _tc_SimpleFactory->id() или _tc_Simple->id(), потому что я не знаком с этими функциями. Если они возвращают строки CORBA, значит, у вас утечка памяти.

0 голосов
/ 23 июня 2010

Является ли PortableServer :: RefCountServantBase абстрактным классом?Не могли бы вы опубликовать его объявление?

Первая ошибка компиляции говорит, что Simple_i не реализует все абстрактные методы, объявленные в базовых классах.Две другие ошибки компиляции относятся к методам в PortableServer :: ServantBase, которые не реализуются в Simple_i.Я думаю, что это абстрактные методы.Отмечу также, что один из них называется invoke, и что POA_Simple объявляет метод invoke.То есть Simple_i наследует метод с именем invoke двумя разными базовыми классами.Я не уверен, может ли это привести к дальнейшим проблемам.

...