C++ 如何在CORBA中获取和设置类字段?(处理CORBA对象的序列)

C++ 如何在CORBA中获取和设置类字段?(处理CORBA对象的序列),c++,sequence,corba,omniorb,C++,Sequence,Corba,Omniorb,我有这样的东西: User.idl: #ifndef __USER_IDL__ #define __USER_IDL__ interface Group; interface User { typedef sequence<Group> Groups; Groups getGroups(); void setGroups(in Groups g); }; #endif 我在这里遇到的问题是:我做得对吗?我的意思是,这个代码一切正常吗?我仍然在学习如何用

我有这样的东西:

User.idl:

#ifndef __USER_IDL__
#define __USER_IDL__

interface Group;

interface User
{
    typedef sequence<Group> Groups;
    Groups getGroups();
    void setGroups(in Groups g);
};

#endif
我在这里遇到的问题是:我做得对吗?我的意思是,这个代码一切正常吗?我仍然在学习如何用CORBA编写代码,有时会产生疑问,尤其是在序列方面

第二个问题:我如何正确设置组的创建者以及获取和设置组的成员

我的意思是,我想在我的主文件中这样做:

 #include "UserImpl.h"
#include "GroupImpl.h"
#include <omniORB4/CORBA.h>
#include <omniORB4/Naming.hh>
#include <iostream>
using std::cout;
using std::cerr;

int main(int argc, char **argv)
{
    UserImpl u;
    u.setLogin("yak");
    u.setID(123);
    cout << u.getLogin() << "\n";
    cout << u.getID() << "\n";
    cout << u.toString() << "\n";


    GroupImpl **g = new GroupImpl*[1];
    for(int i=0; i<1; i++)
    {
        g[i] = new GroupImpl();
    }

    u.setGroups(g);

    return 0;
}
#包括“UserImpl.h”
#包括“GroupImpl.h”
#包括
#包括
#包括
使用std::cout;
使用std::cerr;
int main(int argc,字符**argv)
{
UserImpl u;
u、 setLogin(“yak”);
u、 setID(123);

cout好的,我想我找到了如何编写
getGroups
getUsers
的实现:

User::Groups* UserImpl::getGroups()
{
    const size_t size = this->groups.size();
    User::Groups_var seqOfObjects = new User::Groups(size);
    seqOfObjects->length(size);

    size_t i = 0;
    vector<GroupImpl*>::const_iterator it = groups.begin();
    while (it != groups.end())
    {
        seqOfObjects[i] = Group::_duplicate((*it)->_this());
        ++it;
        ++i;
    }

   return seqOfObjects._retn();
}
User::Groups*UserImpl::getGroups()
{
const size\u t size=this->groups.size();
User::Groups\u var seqOfObjects=新用户::组(大小);
Seqof对象->长度(大小);
尺寸i=0;
vector::const_迭代器it=groups.begin();
while(it!=groups.end())
{
seqOfObjects[i]=组::_duplicate((*it)->_this());
++它;
++一,;
}
返回seqOfObjects._retn();
}

是不是?但是我仍然存在代码< > SETUSES 和 SETGROUTS/C++ >实现。

你需要把它缩小到一个问题。抱歉,你在这里做了很多错误。你需要熟悉IDL到C++的映射。我建议把IDL拿到C++映射文档FRO。我是OMG网站。也可以用C++来查一下亨宁和维诺夫斯奇的高级CORBA编程。@ Brian Neal:是的,我读过这本书,但没有发现任何对象的序列。你能帮我一点吗?我的意思是在这本书中只有一个IDL界面,我熟悉它(它有一系列的对象)。但是,没有例子实现。Yak,你需要知道的一切都在这本书中。它详细描述了在服务器和客户端都使用的序列的IDL到C++映射。
class UserImpl;

class GroupImpl : public POA_Group
{
    private :

        UserImpl *founder;
        Group::Users members;            

    public :

        User_ptr getFounder();
        void setFounder(::User_ptr u);
        Group::Users* getUsers();
        void setUsers(const ::Group::Users& u);
};

User_ptr GroupImpl::getFounder()
{
    return this->founder->_this();
}

void GroupImpl::setFounder(::User_ptr u)
{

}

Group::Users* GroupImpl::getUsers()
{

}

void GroupImpl::setUsers(const ::Group::Users& u)
{

}
 #include "UserImpl.h"
#include "GroupImpl.h"
#include <omniORB4/CORBA.h>
#include <omniORB4/Naming.hh>
#include <iostream>
using std::cout;
using std::cerr;

int main(int argc, char **argv)
{
    UserImpl u;
    u.setLogin("yak");
    u.setID(123);
    cout << u.getLogin() << "\n";
    cout << u.getID() << "\n";
    cout << u.toString() << "\n";


    GroupImpl **g = new GroupImpl*[1];
    for(int i=0; i<1; i++)
    {
        g[i] = new GroupImpl();
    }

    u.setGroups(g);

    return 0;
}
User::Groups* UserImpl::getGroups()
{
    const size_t size = this->groups.size();
    User::Groups_var seqOfObjects = new User::Groups(size);
    seqOfObjects->length(size);

    size_t i = 0;
    vector<GroupImpl*>::const_iterator it = groups.begin();
    while (it != groups.end())
    {
        seqOfObjects[i] = Group::_duplicate((*it)->_this());
        ++it;
        ++i;
    }

   return seqOfObjects._retn();
}