Any_varクラス |
CORBA::Anyのメモリ管理を扱うクラスです。
4.4.1.16. CORBA::Any_varクラス |
CORBA::Anyのメモリ管理を扱うクラスです。CORBA::Any_varを使うことでメモリの解放を簡単にできます。
CORBA::Anyに対して値を設定したり値を取り出す操作を行うときに、一部のIDL既定義型については補助的な型が定義されています。
これらの型定義は、「CORBA::Anyの利用を補助する型」を参照してください。
Any_var | デフォルトコンストラクタ |
Any_var(const CORBA::Any_var&) | コピーコンストラクタ |
Any_var(CORBA::Any*) | 値の挿入を行うコンストラクタ |
~Any_var | デストラクタ |
operator=(CORBA::Any*) operator=( const CORBA::Any_var &) |
代入オペレータ |
operator->() | 保持しているCORBA::Anyのポインタを返す矢印(->)オペレータ |
operator CORBA::Any*()
const operator CORBA::Any*&() |
保持しているCORBA::Anyのポインタを返すキャスト |
operator
const CORBA::Any&() const operator CORBA::Any&() |
保持しているCORBA::Anyの参照を返すキャスト |
operator>>=(<basic
type A>&) const operator>>=(const char*&) const operator>>=(char*&) const operator>>=(const CORBA::Any*&) const operator>>=(CORBA::Any&) const |
値を取り出す |
<basic type A>にはCORBA::Short, CORBA::UShort, CORBA::Long, CORBA::ULong, CORBA::LongLong, CORBA::ULongLong, CORBA::Float, CORBA::Double, CORBA::LongDouble が入ります。
<basic type B>にはboolean, char, wchar, octet, (固定長)string, (固定長)wstringが入ります。たとえばbooleanならばto_booleanとなります。
ユーザ定義の型については、<user type>型を扱うオペレータがIDLコンパイラによって自動的に生成されます。
<basic type A>にはCORBA::Short, CORBA::UShort, CORBA::Long, CORBA::ULong, CORBA::LongLong, CORBA::ULongLong, CORBA::Float, CORBA::Double, CORBA::LongDouble が入ります。
<basic type B>にはboolean, char, wchar, octet, (固定長)string, (固定長)wstringが入ります。たとえばbooleanならばfrom_booleanとなります。
ユーザ定義の型については、<user type>型を扱うオペレータがIDLコンパイラによって自動的に生成されます。
CORBA::Any_var::Any_var - デフォルトコンストラクタ
#include <orb.h> CORBA::Any_var::Any_var();
CORBA::Any_varのインスタンスを生成するときに使用します。内部で保持しているCORBA::Anyへのポインタはヌル・ポインタに初期化されます。
ありません。
起こりません。
CORBA::Any_var::Any_var(const CORBA::Any_var&)
- コピーコンストラクタ
#include <orb.h> CORBA::Any_var::Any_var(const CORBA::Any_var& a);
CORBA::Any_varのインスタンスを作成しaをコピーします。
ありません。
コピーコンストラクタは内部でCORBA::Anyをコピーするため、メモリ不足によるエラーが起こることがあります。この場合、CORBA::Anyへのポインタはヌル・ポインタに設定されます。
CORBA::Any_var::Any_var(CORBA::Any*) - 値の挿入を行うコンストラクタ
#include <orb.h> CORBA::Any_var::Any_var(CORBA::Any* a);
CORBA::Any_varのインスタンスを作成し、aのメモリ領域の解放はCORBA::Any_varのインスタンスが行います。したがって、引数として渡した後は、値を操作してはいけません。
ありません。
起こりません。
CORBA::Any_var::~Any_var - デストラクタ
#include <orb.h> CORBA::Any_var::~Any_var();
CORBA::Any_varのインスタンスを削除するときに使用します。ユーザが明示的に呼び出すことはありません。~Any_varは、deleteオペレータを使ったときあるいはスコープから抜けるときに自動的に呼び出され、保持していたCORBA::Anyの領域も解放します。
ありません。
起こりません。
CORBA::Any_var::operator=(CORBA::Any*)
CORBA::Any_var::operator=(const CORBA::Any_var&)
- 代入オペレータ
#include <orb.h> CORBA::Any_var& CORBA::Any_var::operator=(CORBA::Any* a); CORBA::Any_var& CORBA::Any_var::operator=( const CORBA::Any_var& a );
CORBA::Any_varのインスタンスにCORBA::Anyを代入またはコピーし、自分自身への参照を返します。もし、左辺がCORBA::Anyを保持していたとき、古いCORBA::Anyは破棄されます。
CORBA::Any*型で代入した場合は、ポインタを代入し、自分自身への参照を返します。aのメモリ領域の解放はCORBA::Any_varのインスタンスが行います。したがって、aは引数に渡した後に操作してはいけません。代入されたaは、deleteオペレータを使ったときまたはスコープを抜けるときに自動的に解放されます。
CORBA::Any_var&型からの代入は右辺が保持している領域のコピーし、自分自身への参照を返します。コピーされた領域は、deleteオペレータを使ったときまたはスコープを抜けるときに自動的に解放されます。
自分自身への参照を返します。
CORBA::Any_var&型からの代入はCORBA::Anyをコピーするため、メモリ不足によるエラーが起こることがあります。この場合、CORBA::Anyへのポインタはヌル・ポインタに設定されます。
CORBA::Any_var::operator->()
- 保持しているAnyのポインタを返す矢印(->)オペレータ
#include <orb.h> CORBA::Any* CORBA::Any_var::operator->();
CORBA::Any_varのインスタンスが保持しているCORBA::Anyのポインタを返します。この演算子を使うことにより、CORBA::Any*に対するオペレーション呼び出しと同等に扱うことができるようになります。
保持しているCORBA::Anyのポインタを返します。
起こりません。
CORBA::Any_var::operator CORBA::Any*() const
CORBA::Any_var::operator CORBA::Any*&()
- 保持しているCORBA::Anyのポインタを返すキャスト
#include <orb.h> CORBA::Any_var::operator CORBA::Any*() const; CORBA::Any_var::operator CORBA::Any*&();
CORBA::Any_varのインスタンスが保持しているCORBA::Anyのポインタを返します。CORBA::Any*やCORBA::Any*&へのキャストが必要なとき、CORBA::Any*もしくはCORBA::Any*&と同等に扱えます。
保持しているCORBA::Anyのポインタを返します。
起こりません。
CORBA::Any_var::operator const CORBA::Any&()
const
CORBA::Any_var::operator CORBA::Any&()
- 保持しているCORBA::Anyの参照を返すキャスト
#include <orb.h> CORBA::Any_var::operator const CORBA::Any&() const; CORBA::Any_var::operator CORBA::Any&();
CORBA::Any_varのインスタンスが保持しているCORBA::Anyの参照を返します。const CORBA::Any&やCORBA::Any&へのキャストが必要なとき、const CORBA::Any&もしくはCORBA::Any&と同等に扱えます。
保持しているCORBA::Anyの参照を返します。
起こりません。
CORBA::Any_var::operator>>=(<basic type A>&)
const
CORBA::Any_var::operator>>=(const char*&) const
CORBA::Any_var::operator>>=(char*&) const
CORBA::Any_var::operator>>=(const CORBA::Any*&) const
CORBA::Any_var::operator>>=(CORBA::Any&) const
CORBA::Any_var::operator>>=(CORBA::Any::to_<basic type B>) const
CORBA::Any_var::operator>>=(const CORBA::Any&, <user type>*&) const
- 値の取り出し
#include <orb.h> // CORBA::Short, CORBA::UShort, CORBA::Long, CORBA::ULong, // CORBA::LongLong, CORBA::ULongLong, CORBA::Float, // CORBA::Double, CORBA::LongDouble CORBA::Boolean CORBA::Any_var::operator>>=(<basic type A>& x) const; // 可変長文字列 CORBA::Boolean CORBA::Any_var::operator>>=(const char*& x) const; CORBA::Boolean CORBA::Any_var::operator>>=(char*& x) const; // Any CORBA::Boolean CORBA::Any_var::operator>>=(const CORBA::Any*& x) const; CORBA::Boolean CORBA::Any_var::operator>>=(CORBA::Any& x) const; // boolean, char, wchar, octet, (固定長)string, (固定長)wstring // 値の取り出しを補助する型to_XXXを利用する CORBA::Boolean CORBA::Any_var::operator>>=(CORBA::Any::to_<basic type B> x) const; // ユーザ定義型 CORBA::Boolean CORBA::Any_var::operator>>=(const CORBA::Any& any, <user type>*& x) const;
CORBA::Any_varが保持している値をxに取り出します。このとき、CORBA::Any_varが保持しているタイプコードとxの型が一致しているか調べます。値の取り出しが成功したときは1を返し、失敗したときは0を返します。
>>=オペレータは各型ごとに用意されます。
<basic type A>にはCORBA::Short, CORBA::UShort, CORBA::Long, CORBA::ULong,
CORBA::LongLong, CORBA::ULongLong, CORBA::Float, CORBA::Double, CORBA::LongDouble
が入ります。
xがこれらの型の場合、自分自身が保持している値を直接xに代入します。
例) CORBA::Any_varからCORBA::Long型の値を取り出す。
CORBA::Long value; CORBA::Any_var a = new CORBA::Any(); a <<= CORBA::Long(42); // 値の挿入 if (a >>= value) { // 値の取り出し // 値を使用する }
xがconst char*型のときは、自分自身が保持している値(char*)を直接xに代入します。xのメモリ管理はanyにありますのでxを解放してはいけません。
xがchar*型のときは、自分自身が保持している値(char*)をCORBA::string_dup関数でコピーした値(char*)をxに代入します。
例) CORBA::Any_varから可変長文字列を取り出す。
const char* value; CORBA::Any_var a = new CORBA::Any(); a <<= (const char*)"string"; // 値の挿入 if (a >>= value) { // 値の取り出し // 値を使用する(値は解放してはいけない) }
xがCORBA::Any型のときは、自分自身が保持している値(CORBA::Any*)が指すCORBA::Anyをxにコピーします。
xがconst CORBA::Any*型のときは、自分自身が保持している値(CORBA::Any*)を直接xに代入します。xのメモリ管理はanyにありますのでxを解放してはいけません。
<basic type B>にはboolean, char, wchar, octet, (固定長)string, (固定長)wstring, objectが入ります。たとえばbooleanならばto_booleanとなります。to_XXX型は値の取り出しを補助するための型です。これらの型定義は「CORBA::Anyの利用を補助する型」を参照してください。
boolean, char, wchar, octetの場合は、自分自身が保持している値をキャストしてx.refに代入します。たとえば、booleanならCORBA::Booleanにキャストします。
(w)stringの場合は、まずx.boundの大きさの領域をCORBA::(w)string_allocオペレーションにより確保し、x.valに代入します。つぎに自分自身が保持している値をx.valが指している領域にコピーします。
例) CORBA::Any_varからCORBA::Boolean型とCORBA::String型の値を取り出す。
// CORBA::Booleanの例 CORBA::Boolean b = 1; CORBA::Any_var a = new CORBA::Any(); a <<= CORBA::Any::from_boolean(b); // 値の挿入 ... if (a >>= CORBA::Any::to_boolean(b)) { // 値の取り出し // ...booleanの取り出し成功 } // CORBA::Stringの例 char* p = "bounded"; a <<= CORBA::Any::from_string(p, 8); // 固定長文字列の挿入 ... if (a >>= CORBA::Any::to_string(p, 8)) { // 値の取り出し // ...文字列取り出し成功 }
ユーザ定義の型については、<user type>型を扱うオペレータがIDLコンパイラによって自動的に生成されます。
使い方はCORBA::Shortなどの場合と変わりません。anyが保持している値がxに返されます。
例) CORBA::Any_varから構造体を取り出す。
// IDL struct MyStruct { long lmem; short smem; }; // C++ CORBA::Any_var a = new CORBA::Any(); MyStruct *sp = new MyStruct; ... a <<= sp; // aにMyStructの値を設定。メモリ管理がCORBA::Any_varに移る。 MyStruct *struct_ptr; if (a >>= struct_ptr) { // 値の取り出し // 値を使用可能 }
配列の取り出しにはArray_forany(実際にはArrayの部分に配列の型名が入る)という補助型がIDLコンパイラによって生成されます。配列を取り出す例についてはC++マッピング「anyからの値の取り出し」を参照してください。
取り出しに成功した場合は1が返ります。失敗した場合には0が返ります。
失敗した場合には0が返ります。また、メモリの確保をともなう操作の場合はxに0が返されます。
C++マッピング「any」
CORBAの仕様変更により、文字列取り出しオペレータはCORBA::Any_var::operator>>=(char*&) constからCORBA::Any_var::operator>>=(const char*&) constに、CORBA::Any取り出しオペレータはCORBA::Any_var::operator>>=(CORBA::Any&) constからCORBA::Any_var::operator>>=(const CORBA::Any*&) constにそれぞれ変わりました。今バージョンでは、過去のソースコードとの互換のために旧オペレータをサポートしますが今後のバージョンでのサポートは保証しません。新規に作成するプログラムでは、これらの旧オペレータを使用しないでください。
CORBA::String_var型を引数にして可変長文字列を取り出す場合、R4.5以前のバージョンでは、CORBA::Any_var::operator>>=(char*&) constが呼び出されますが、R5.1では、CORBA::Any_var::operator>>=(char*&) constとCORBA::Any_var::operator>>=(const char*&) constのどちらのオペレータが呼び出されるかは不定(コンパイラ依存)です。R4.5以前と同様の動作をさせたいときは、引数のCORBA::String_varをchar*&で明示的にキャストする必要があります。
CORBA::Any_var型を引数にしてCORBA::Anyを取り出す場合、R4.5以前のバージョンでは、CORBA::Any_var::operator>>=(CORBA::Any&) constが呼び出されますが、R5.1では、CORBA::Any_var::operator>>=(CORBA::Any&) constとCORBA::Any_var::operator>>=(const CORBA::Any*&) constのどちらのオペレータが呼び出されるかは不定(コンパイラ依存)です。R4.5以前と同様の動作をさせたいときは、引数のCORBA::Any_varをCORBA::Any&で明示的にキャストする必要があります。
CORBA::Any_var::operator<<=(<basic type A>)
CORBA::Any_var::operator<<=(const char*)
CORBA::Any_var::operator<<=(char*)
CORBA::Any_var::operator<<=(const CORBA::Any&)
CORBA::Any_var::operator<<=(CORBA::Any*)
CORBA::Any_var::operator<<=(const CORBA::Any_var&)
CORBA::Any_var::operator<<=(CORBA::Any::from_<basic type B>)
CORBA::Any_var::operator<<=(CORBA::Any&,
const <user type>&)
CORBA::Any_var::operator<<=(CORBA::Any&, <user
type>*)
- 値を挿入する
#include <orb.h> // CORBA::Short, CORBA::UShort, CORBA::Long, CORBA::ULong, // CORBA::LongLong, CORBA::ULongLong, CORBA::Float, // CORBA::Double, CORBA::LongDouble void CORBA::Any_var::operator<<=(<basic type A> x); // 可変長文字列 void CORBA::Any_var::operator<<=(const char* x) void CORBA::Any_var::operator<<=(char* x) // Any void CORBA::Any_var::operator<<=(const CORBA::Any& x) void CORBA::Any_var::operator<<=(CORBA::Any* x) void CORBA::Any_var::operator<<=(const CORBA::Any_var& x) // boolean, char, wchar, octet, (固定長)string, (固定長)wstring // 値の取り出しを補助する型from_XXXを利用する void CORBA::Any_var::operator<<=(CORBA::Any::from_<basic type B> x); // ユーザ定義型 void CORBA::Any_var::operator<<=(CORBA::Any& any, const <user type>& x); void CORBA::Any_var::operator<<=(CORBA::Any& any, <user type>* x);
CORBA::Any_varに値xを挿入します。このとき、CORBA::Any_varが保持するタイプコードはxの型と一致するように自動的に設定されます。
<<=オペレータは各型ごとに用意されます。
<basic type A>にはCORBA::Short, CORBA::UShort, CORBA::Long, CORBA::ULong,
CORBA::LongLong, CORBA::ULongLong, CORBA::Float, CORBA::Double, CORBA::LongDouble
が入ります。
xがこれらの型の場合、xの値が直接any内部に保持されます。
例) CORBA::Any_varにCORBA::Long型の値を挿入する。
CORBA::Long value; CORBA::Any_var a = new CORBA::Any(); a <<= CORBA::Long(42); // 値の挿入
xがconst char*型の場合は、xをCORBA::string_dup関数でコピーした値(char*)をany内部に保持します。
xがchar*型の場合は、xの値(char*)が直接any内部に保持されます。xのメモリ管理がanyへ移りますのでxを解放してはいけません。
例) CORBA::Any_varに可変長文字列を挿入する。
char* str1 = CORBA::string_dup("string1"); const char* str2 = "string2"; CORBA::Any_var a = new CORBA::Any(); a <<= str1; // str1のメモリ管理がanyへ移るためstr1を解放してはいけない a <<= str2; // str2のコピーがanyに保持される
operator<<=(const CORBA::Any& x)はxのコピーを生成して自分自身に挿入します。
operator<<=(const CORBA::Any* x)はxをコピーせずに自分自身に挿入します。xのメモリ領域の解放は挿入した側で行います。
operator<<=(const CORBA::Any_var& x)はxのコピーを生成して自分自身に挿入します。
<basic type B>にはboolean, char, wchar, octet, (固定長)string, (固定長)wstringが入ります。たとえばbooleanならばfrom_booleanとなります。from_XXX型は値の挿入を補助するための型です。これらの型定義は「CORBA::Anyの利用を補助する型」を参照してください。
boolean, char, wchar, octetの場合は、x.valをnewして自分自身に挿入します。
(w)stringの場合は、まずxのnocopyフラグが1かどうかを調べます。nocopyが1ならば自分自身に挿入します。xのメモリ領域の解放は挿入された側で行われます。nocopyが0のときは、xが保持している文字列が入る大きさの領域をCORBA::(w)string_allocオペレーションを使って確保します。文字列の長さはx.boundが0より大きければx.boundに設定されます。もしx.boundが0ならば、可変長文字列と認識してx.valの長さを調べます。
例) CORBA::Any_varにCORBA::Boolean型と文字列を挿入する。
// CORBA::Booleanの例 CORBA::Boolean b = 1; CORBA::Any_var any = new CORBA::Any(); any <<= CORBA::Any::from_boolean(b); // 値の挿入 // 文字列の例 char* p = "bounded"; char* p2 = CORBA::string_dup(p); // 固定長文字列の挿入 // (コピーが生成される。) any <<= CORBA::Any::from_string(p, 8); // 固定長文字列の挿入 // (コピーは生成されない。メモリ管理はCORBA::Anyに移る。) any <<= CORBA::Any::from_string(p2, 8, 1); // 可変長文字列の挿入 // (コピーが生成される。) any <<= CORBA::Any::from_string(p, 0);
ユーザ定義の型については、<user type>型を扱うオペレータがIDLコンパイラによって自動的に生成されます。
引数で渡したメモリ領域の管理は引数の型により異なります。
operator<<=(CORBA::Any& any, const <user type>& x)はxをコピーしてanyに挿入します。
operator<<=(CORBA::Any& any, <user type>* x)はコピーせずにanyに挿入されます。値のメモリ領域の解放はanyによって行われます。
例) CORBA::Any_varに構造体を挿入する。
// IDL struct MyStruct { long lmem; short smem; }; // C++ CORBA::Any_var a = new CORBA::Any(); MyStruct *sp = new MyStruct; MyStruct s; ... a <<= sp; // aにMyStructの値を設定。メモリ管理がanyに移る。 a <<= s; // MyStructのコピーが作成される。
配列の挿入にはArray_forany(実際にはArrayの部分に配列の型名が入る)という補助型がIDLコンパイラによって生成されます。配列を挿入する例についてはC++マッピング「配列のanyへの挿入」を参照してください。
ありません。
コピーに必要なメモリ領域を確保できなかったときは、値にヌル・ポインタがセットされます。
C++マッピング「any」
コピーが行われない<<=オペレータが使用されたときには、CORBA::Any_varがデストラクトされるときに保持している値も解放されます。2重解放にならないように注意してください。また、CORBA::Any_varに挿入した後は値を操作してはいけません。
CORBA::String_var型を引数にして可変長文字列を挿入する場合、R4.5以前では、CORBA::Any_var::operator<<=(const char*)が呼び出されましたが、R5.1以降では、CORBA::Any_var::operator<<=(char*)とCORBA::Any_var::operator<<=(const char*)のどちらのオペレータが呼び出されるかは不定(コンパイラ依存)です。
また、char*型を引数にして可変長文字列を挿入する場合、R4.5以前では、CORBA::Any_var::operator<<=(const char*)が呼び出されますが、R5.1以降では、CORBA::Any_var::operator<<=(char*)が呼び出されます。
どちらの場合も、R4.5以前と同様の動作をさせたいときは、引数をconst char*型に明示的にキャストする必要があります。
namespace CORBA { class Any { // booleanの取り出しのための補助型 struct to_boolean { to_boolean(CORBA::Boolean &b) : ref(b) {} CORBA::Boolean &ref; }; // charの取り出しのための補助型 struct to_char { to_char(CORBA::Char &c) : ref(c) {} CORBA::Char &ref; }; // wcharの取り出しのための補助型 struct to_wchar { to_wchar(CORBA::WChar &c) : ref(c) {} CORBA::WChar &ref; }; // octetの取り出しのための補助型 struct to_octet { to_octet(CORBA::Octet &o) : ref(o) {} CORBA::Octet &ref; }; // 文字列の取り出しのための補助型 struct to_string { to_string(char *&s, CORBA::ULong b) : val(s), bound(b) {} char *&val; CORBA::ULong bound; }; // ワイド文字列の取り出しのための補助型 struct to_wstring { to_wstring(CORBA::WChar *&s, CORBA::ULong b) : val(s), bound(b) {} CORBA::WChar *&val; CORBA::ULong bound; }; // CORBA::Object型の取り出しのための補助型 struct to_object { to_object(CORBA::Object_ptr &obj) : ref(obj) {} CORBA::Object_ptr &ref; }; // CORBA::ValueBase型の取り出しのための補助型 struct to_value { to_value(CORBA::ValueBase *&base) : ref(base) {} CORBA::ValueBase *&ref; }; // CORBA::AbstractBase型の取り出しのための補助型 struct to_abstract_base { to_abstract_base(CORBA::AbstractBase_ptr &base) : ref(base) {} CORBA::AbstractBase_ptr &ref; }; // booleanの挿入のための補助型 struct from_boolean { from_boolean(CORBA::Boolean b) : val(b) {} CORBA::Boolean val; }; // octetの挿入のための補助型 struct from_octet { from_octet(CORBA::Octet o) : val(o) {} CORBA::Octet val; }; // charの挿入のための補助型 struct from_char { from_char(CORBA::Char c) : val(c) {} CORBA::Char val; }; // wcharの挿入のための補助型 struct from_wchar { from_wchar(CORBA::WChar c) : val(c) {} CORBA::WChar val; }; // 文字列の挿入のための補助型 struct from_string { from_string(char* s, CORBA::ULong b, CORBA::Boolean nocopy = 0) : val(s), bound(b) {} char *val; CORBA::ULong bound; }; // ワイド文字列の挿入のための補助型 struct from_wstring { from_wstring(CORBA::WChar* s, CORBA::ULong b, CORBA::Boolean nocopy = 0) : val(s), bound(b) {} CORBA::WChar *val; CORBA::ULong bound; }; }; };