【问题标题】:CORBA::String_var -> I can't assign any value to class field of this typeCORBA::String_var -> 我不能为这种类型的类字段分配任何值
【发布时间】: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,我上面给出的代码没有显示任何东西......这里有什么问题?

【问题讨论】:

    标签: c++ string corba


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 2021-03-23
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多