2

私は3日以上、CORBAとC ++、およびIDLで記述されたアプリインターフェイスを扱ってきました。

私のアプリのインターフェースは次のようになります。

#ifndef __FORUM_INTERFACE_IDL__
#define __FORUM_INTERFACE_IDL__

#include "Forum.idl"
typedef sequence<Forum> Forums;

interface ForumInterface
{
    Forums getForumList(in Forum f);
    Forums getUsersForumList(in long UsersID);
    void addNewTopic(in Forum f, in long UsersID, in string title);
};

#endif

私はそれを*.hhおよび*.ccファイルに「コンパイル」します:omniidl -bcxx ForumInterface.idl

私のフォーラムオブジェクト(IDLでも定義されています)は次のようになります。

#ifndef __FORUM_IDL__
#define __FORUM_IDL__

interface Forum
{
    long getForumID();
    void setForumID(in long id);
    string getForumName();
    void setFroumName(in string name);
    Forum getForumParent();
    void setForumParent(in Forum f);
};

#endif

私はそれを*.hhおよび*.ccファイルに「コンパイル」します:omniidl -bcxx Forum.idl

私はForumとForumInterfaceの両方の実装を書こうとしました。私はフォーラムから始めました。クラスFroumImplの定義は次のとおりです。

#ifndef __FORUMIMPL_H__
#define __FORUMIMPL_H__

#include "Forum.hh"

class ForumImpl : public POA_Forum
{
    private :

        long id;
        char *name;
        ForumImpl parent;

    public :

        long getForumID();
        void setForumID(long id);
        char* getForumName();
        void setFroumName(const char* name);
        ForumImpl getForumParent();
        void setForumParent(ForumImpl f);
};

#endif

そしてそれは宣言です(今のところそれは空です):

#include "ForumImpl.h"

long ForumImpl::getForumID(){}
void ForumImpl::setForumID(long id){}
char* ForumImpl::getForumName(){}
void ForumImpl::setFroumName(const char* name){}
ForumImpl ForumImpl::getForumParent(){}
void ForumImpl::setForumParent(ForumImpl f){}

私はそれをコンパイルしようとしました、

g++ -c ForumImpl.cpp -I$OMNIORB_HOME/include -I$OMNIORB_HOME/include/omniORB4

しかし、エラーが発生しました:

ForumImpl.cpp:1:0からインクルードされたファイル:ForumImpl.h:12:19:エラー:フィールド'parent'のタイプが不完全ですForumImpl.h:20:19:エラー:'virtual ForumImplForumImpl::に指定された戻りタイプが競合していますgetForumParent()'Forum.hh:161:21:エラー:オーバーライド' virtual _objref_Forum * _impl_Forum :: getForumParent()'ForumImpl.h:20:19:エラー:メンバー関数の無効な抽象戻り型' virtual ForumImpl ForumImpl :: getForumParent ()'ForumImpl.h:6:7:注:次の仮想関数は' ForumImpl'内で純粋であるため:Forum.hh:162:16:注:virtual void _impl_Forum :: setForumParent(Forum_ptr)ForumImpl.h:21: 14:エラー:パラメータ'f'を抽象型'ForumImpl' ForumImpl.h:6:7に宣言できません:注:型'ForumImpl'には純粋仮想関数ForumImpl.cppがあるため:メンバー関数'virtual ForumImpl ForumImpl ::getForumParent()':ForumImpl.cpp:7:11:エラー:メンバー関数の抽象リターンタイプが無効です' virtual ForumImpl ForumImpl :: getForumParent()'ForumImpl.h:6:7:注:タイプ'ForumImpl'は純粋仮想関数ForumImpl.cpp:グローバルスコープで:ForumImpl.cpp:8:42:エラー:パラメーター'f'を抽象型'ForumImpl'と宣言できませんForumImpl.h:6:7:注:型'ForumImpl'は純粋であるため仮想関数

最悪なのは、なぜこのコードでこのようなエラーが発生するのかわからないことです...つまり、すべてのForumImpl関数を定義したので、それらのいずれかが仮想になりました。私はこれの何が悪いのかを理解しようと何時間も費やしましたが、手がかりはありません:(

誰か助けてもらえますか?私のファイル:http : //www6.zippyshare.com/v/69552292/file.htmlこのtarアーカイブにMakefileを追加したので、コマンド「make all」を実行するだけで、すべてが実行されます

なぜ私がそれらのエラーを受け取ったのか、そしてこれを修正するために何をすべきかを誰かが教えてくれたらとてもありがたいです、私は本当にそれが必要です。乾杯:)

編集:

ForumImpl.hとForumImpl.cppを変更しました。

#ifndef __FORUMIMPL_H__
#define __FORUMIMPL_H__

#include "Forum.hh"

class ForumImpl : public POA_Forum
{
    private :

        long id;
        char *name;
        ForumImpl *parent;

    public :

        long getForumID();
        void setForumID(long id);
        char* getForumName();
        void setFroumName(const char* name);
        ForumImpl* getForumParent();
        void setForumParent(ForumImpl *f);
};

#endif

#include "ForumImpl.h"
long ForumImpl::getForumID(){}
void ForumImpl::setForumID(long id){}
char* ForumImpl::getForumName(){}
void ForumImpl::setFroumName(const char* name){}
ForumImpl* ForumImpl::getForumParent(){}
void ForumImpl::setForumParent(ForumImpl *f){}

しかし、これは私にそれらのエラーを与えました:

g ++ -c ForumImpl.cpp -IMNIORB_HOME / include -IMNIORB_HOME / include / omniORB4 ForumImpl.cpp:1:0からインクルードされたファイル内:ForumImpl.h:20:20:エラー:'仮想ForumImpl*ForumImpl::の無効な共変リターンタイプgetForumParent()'Forum.hh:161:21:エラー:オーバーライド'仮想_objref_Forum * _impl_Forum :: getForumParent()'</ p>

4

2 に答える 2

2

の署名は次のForumImpl::getForumParent()ようになります。

Forum_ptr getForumParent();

詳細については、OMGWebサイトからIDLからC++へのマッピングドキュメントをダウンロードする必要があります。Henning&Vinowskiの著書「AdvancedCORBA ProgrammingwithC++ 」もチェックしてください。

于 2012-08-02T01:13:46.873 に答える
1

ForumImplのメソッドシグネチャは、Forum.hhで生成された基本クラスと一致する必要があります。彼らはフォーラムだけを返す必要があります。omn​​iorbの詳細はわかりませんが、TAOにはこれを使用する数百の例があります。たとえば、銀行の例です。オンラインでhttps://svn.dre.vanderbilt.edu/viewvc/Middleware/trunk/から見つけることもできます。 TAO / examples / Simple / bank /

于 2012-08-01T19:26:34.613 に答える