CORBA::String_var -> 我不能为这种类型的类字段分配任何值
Posted
技术标签:
【中文标题】CORBA::String_var -> 我不能为这种类型的类字段分配任何值【英文标题】:CORBA::String_var -> I can't assign any value to class field of this type 【发布时间】:2012-08-07 16:13:31 【问题描述】:我有一个简单的课程:
class MyExample : public POA_Example
CORBA::String_var field;
public:
char* getField();
void setField(const char* f);
;
char* MyExample::getField()
return CORBA::string_dup(this->field.out());
void MyExample::setField(const char* f)
this->field = CORBA::string_dup(f);
还有主应用:
#include "MyExample.h"
#include <iostream>
using std::cout;
int main()
MyExample e;
e.setField("Hello");
cout << e.getField() << "\n";
return 0;
我使用omniORB,我上面给出的代码没有显示任何东西......这里有什么问题?
【问题讨论】:
【参考方案1】:如果您使用的是omniORB,您可能必须至少调用orb_init()
才能使字符串操作正常工作。否则,您拥有的代码似乎很好。
(尽管您不必在setField()
函数中调用string_dup()
,因为当您为其分配const char*
时,String_var
类会自动执行此操作。)
(而且你在cout
中调用e.getField()
是在泄漏内存。但这不应该阻止你看到一些东西。)
【讨论】:
谢谢!但是为什么你说我在我的cout
中调用e.getField()
是在泄漏内存呢?没看懂,有什么问题?有没有其他方法可以获得这个值?
一般情况下您不会拨打本地电话到getField()
。我假设这是一个 CORBA 接口。当用作 CORBA 调用时,骨架将释放您在 string_dup()
中动态分配的内存。但是由于您是在本地调用它,因此您应该在 String_var 中捕获调用结果,以便清理内存。
那么如何编写一个字符串 getter 以便能够使用 getField
方法作为 CORBA 调用?
String_var s(remoteObject->getField()); cout << s << endl;
【参考方案2】:
试试这个,它对我有用:
interface Example
string getString();
void setString(in string s);
long getLong();
void setLong(in long l);
;
#include "example.hh"
class MyExample : public POA_Example
private:
CORBA::Long l;
CORBA::String_var s;
public:
char* getString();
void setString(const char* s);
::CORBA::Long getLong();
void setLong(::CORBA::Long l);
;
#include "MyExample.h"
char* MyExample::getString()
return CORBA::string_dup(this->s.in());
void MyExample::setString(const char* s)
this->s = CORBA::string_dup(s);
::CORBA::Long MyExample::getLong()
return this->l;
void MyExample::setLong(::CORBA::Long l)
this->l = l;
#include "MyExample.h"
#include <omniORB4/CORBA.h>
#include <omniORB4/Naming.hh>
#include <iostream>
using std::cout;
using std::cerr;
int main(int argc, char **argv)
MyExample me;
me.setLong(1234654);
cout << "Long: " << me.getLong() << "\n";
me.setString("Hello");
cout << "String: " << me.getString() << "\n";
return 0;
【讨论】:
以上是关于CORBA::String_var -> 我不能为这种类型的类字段分配任何值的主要内容,如果未能解决你的问题,请参考以下文章
除非我关闭我的表单,否则我的代码不会运行,但是我需要打开我的表单,因为我想显示来自其他代码的信息