3

私は単純なクラスを持っています:

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 を使用していますが、上記のコードでは何も表示されません...ここで何が問題なのですか?

4

2 に答える 2

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;
}
于 2012-08-07T17:20:06.717 に答える
1

orb_init()omn​​iORB を使用している場合、文字列操作が正しく機能する前に、少なくとも呼び出す必要がある場合があります。そうでなければ、あなたが持っているコードは問題ないようです。

string_dup()(ただし、setField()関数を呼び出す必要はありません。String_varクラスに を割り当てると、クラスが自動的に呼び出すためconst char*です。)

(そして、 を呼び出してメモリをリークe.getField()していますcout。しかし、それで何かが見えなくなるわけではありません。)

于 2012-08-08T00:00:43.473 に答える