またもや 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 は私の「数値」属性を属性ではなく関数のように扱っているようですが、そうですか? それを解決する方法は?