0

またもや CORBA で困っています。インターフェイスが 1 つの属性を持つ CORBA のサンプル インターフェイスを書きたかっただけです。

これが私のidlファイルです:

interface Interfface
{
    readonly attribute double number;

    exception myOwnException {
        string reason;
    };

    void ffunction(in double arg) raises (myOwnException);
    double getNumber();
    void setNumber(in double number);
};

IDL インターフェイスの私の実装:

#include "interface.hh"

class Implementation : public POA_Interfface
{
    private :
        double number;

    public :
        virtual void ffunction(double arg);
        virtual double getNumber();
        virtual void setNumber(double number);
};

#include "implementation.h"

void Implementation::ffunction(double arg)
{
    this->number = 0;
    arg++;
    throw Interfface::myOwnException("Sth went terribly wrong!");
}

void Implementation::setNumber(double number){
    this->number = number;
}

double Implementation::getNumber(){
    return this->number;
}

interface.idl、implementation.h、implementation.cpp をコンパイルすると問題ありません。問題は、 server.cpp をコンパイルしたいときです:

#include "implementation.h"
#include <iostream>
#include <omniORB4/CORBA.h>
#include <omniORB4/Naming.hh>

using namespace std;

int main(int argc, char ** argv)
{
    try {
        // init ORB
        CORBA::ORB_ptr orb = CORBA::ORB_init(argc, argv);

        // init POA
        CORBA::Object_var poa_obj = orb->resolve_initial_references("RootPOA");
        PortableServer::POA_var poa = PortableServer::POA::_narrow(poa_obj);
        PortableServer::POAManager_var manager = poa->the_POAManager();

        // create service
        Implementation * service = new Implementation;

        // register within the naming service
        try {
            CORBA::Object_var ns_obj = orb->resolve_initial_references("NameService");
            if (!CORBA::is_nil(ns_obj)) {
                CosNaming::NamingContext_ptr nc = CosNaming::NamingContext::_narrow(ns_obj);
                CosNaming::Name name;
                name.length(1);
                name[0].id = CORBA::string_dup("TestServer");
                name[0].kind = CORBA::string_dup("");
                nc->rebind(name, service->_this());
                cout << "Server is running ..." << endl;
            }
        } catch (CosNaming::NamingContext::NotFound &) {
            cerr << "not found" << endl;
        } catch (CosNaming::NamingContext::InvalidName &) {
            cerr << "invalid name" << endl;
        } catch (CosNaming::NamingContext::CannotProceed &) {
            cerr << "cannot proceed" << endl;
        }

        // run
        manager->activate();
        orb->run();

        // clean up
        delete service;

        // quit
        orb->destroy();
    } catch (CORBA::UNKNOWN) {
        cerr << "unknown exception" << endl;
    } catch (CORBA::SystemException &) {
        cerr << "system exception" << endl;
    }
} 

エラーが発生します:

server.cpp: 関数 'int main(int, char**)' 内: server.cpp:20: エラー: 抽象型 'Implementation' implementation.h:4 のオブジェクトを割り当てることができません: 注: 次の仮想関数が「実装」内の純粋: interface.hh:197: 注: 仮想 CORBA::Double _impl_Interfface::number()

CORBA は私の「数値」属性を属性ではなく関数のように扱っているようですが、そうですか? それを解決する方法は?

4

1 に答える 1

0

属性番号を宣言することにより、サーバントに実装する必要がある number() アクセサーと設定が自動的に取得されます。IDL で getNumber() と setNumber() を定義する必要はありません。属性から readonly タグを削除するだけで、setter も持つことができます。

属性を、リモートでアクセス可能なセッターとゲッターを自動的に生成するものと見なしてください。

于 2012-06-25T14:03:48.173 に答える