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-&gt;getField()); cout &lt;&lt; s &lt;&lt; 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 -> 我不能为这种类型的类字段分配任何值的主要内容,如果未能解决你的问题,请参考以下文章

除非我关闭我的表单,否则我的代码不会运行,但是我需要打开我的表单,因为我想显示来自其他代码的信息

易燃易爆炸

欢迎来的我博客哦

我的第一条博客 - test

为啥我的 Xcode 编译器告诉我我使用了值类型,即使我使用了类?

《让我怎样感谢你》