小田様
産総研 安藤です
方法は3つ位あります。
一番簡単な方法は、以下のように一つのIDLに記述することです。
Observer と Notifier は Subject で相互に依存してますので、
それほど変なやり方じゃないと思います。
好みの問題になりますが、IDLはあまり分割しないのが一般的です。
OpenRTMに付属のIDLを見ていただければわかると思いますが、
ある機能を提供するインターフェースのセットをまとめてIDLで定義しています。
CORBAのその他のIDL定義も、それほど細かく分割されていません。
原理的には分割しても、ちゃんとコンパイルできなければならないのですが、
rtc-templateはファイル間の依存関係まで調べてコードを生成しているわけでは
ありませんので、複雑依存関係のあるIDLの場合、Makefileやコードなどに
いろいろ手直しが必要になります。
-------------------------Observer.idl---------------------------
interface Subject {
void foo();
};
interface Observer {
void listenUpdate(in Subject aSubject);
};
interface Notifier {
void notifyUpdate(in Subject aSubject);
};
-------------------------Observer.idl---------------------------
rtc-template -bcxx \
--module-name=SubjectObserverEngine --module-type='DataFlowComponent' \
--module-desc='Subject Observer Engine test' \
--module-version=1.0 --module-vendor='Kyushu Institute of Technology' \
--module-category=Consumer \
--module-comp-type=DataFlowComponent --module-act-type=SPORADIC \
--module-max-inst=1 \
--service=Notifier:notifier:Notifier \
--consumer=Observer:observer0:Observer \
--consumer=Observer:observer1:Observer \
--consumer=Observer:observer2:Observer \
--service-idl=Observer.idl
2番目のやり方は、面倒ですがMakefileを修正するやり方です。
以下の修正を施したMakefileでビルドできました。
皆様
九州工業大学 小田と申します。
Open-RTM 0.4.2 C++、Ubuntu 7、omniORB 4.0.7にて開
発を行っています。
そこで質問なのですが、サービスポートのIDL定義において、複数の
IDL間で、共通に利用する型を参照する方法を知りたくメールしてお
ります。
例えば、デザインパターンでいうSubject-Observerパターン
において、Subjectの更新にともなって、複数のObserver
に更新の通知を行うような
コンポーネントSubjectObserverEngineを実装することを想定
します。(最後に具体的なrtc-templateコマンドを挙げています)
そこで、
監視の対象:Subject型、
Subjectの通知の対象:Observer型、
通知を行う主体:Notifier型
として宣言します。
このとき、Observer型とNotifier型は、メソッドの引数に
Subjectが必要なので、共にSubject型の宣言を必要とします
が、これを素直を行う方法が分からなくて困っています。
より詳細には、