2012-08-07 51 views
3

我有一个简单的类的类字段中的任何值:CORBA :: String_var - >我不能分配给该类型

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()之前的字符串操作,将工作的权利。你的代码似乎很好,否则。

(虽然你不必调用string_dup()setField()功能,为String_var类会自动完成,当你给它分配一个const char*

(而你在你的cout调用e.getField()泄漏内存。但是这不应该阻止你看到的东西。)

+0

的感谢!但是,你为什么通过在我的'cout'中调用'e.getField()'来泄漏内存?我不明白,它有什么问题?有没有其他的方法来获得这个值? – yak 2012-08-08 15:26:01

+0

那么通常你会不会做出'getfield命令)的本地呼叫('。我假设这是一个CORBA接口。当用作CORBA调用时,骨架将释放您在'string_dup()'中动态分配的内存。但是由于你在本地调用它,你应该在String_var中捕获调用的结果,这样内存就会被清除。 – 2012-08-08 16:25:34

+0

所以如何写一个字符串消气剂可以使用'getField'方法CORBA调用? – yak 2012-08-08 16:30:34

1

试试这个,它的工作对我来说:

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; 
} 
相关问题