Web サービスで複合型を使用する場合、単純型の場合と同じ規則が適用されます。
次の例では、複合型を使用して WSDL から生成されるクラスを示しています。この例で示すように、複合型は set および get メソッドの使用時にデータのシャロー・コピーを取るだけです。
class STORAGE_CLASS_INFO ComplexType { public: class xsd__string Message; class xsd__int MessageSize; xsd__string getMessage(); void setMessage( xsd__string InValue); xsd__int getMessageSize(); void setMessageSize( xsd__int InValue);
クライアントは、オブジェクトを指すポインターを使用するときに、ポインターがコピーされるのみで、複製されないことを覚えておく必要があります。例えば、複合型にストリングが含まれている場合、クライアントがストリングの内容を設定するためには、ローカル・ストリングを作成し、複合オブジェクトで set メソッドを使用して、そのストリングをオブジェクトにコピーします。
次の例では、複合型の使用時に適用される制約事項を示します。
xsd__int iStringLength = strlen( “Hello World”); xsd_string myNewString = new char[iStringLength + 1]; strcpy( myNewString, “Hello World”); myComplexType.setMessage( myNewString); delete myNewString; // Do this and myComplexType.Message will be left pointing to // invalid memory.
代替:
delete myComplexType; // Do this and myNewMessage will be pointing to invalid memory.
メソッド呼び出しで使用される場合、複合型のパラメーターに単純型と同じ規則が適用されます。以下にこの規則を示します。
ComplexType * myNewComplexType = new ComplexType( myExistingComplexType);
これにより、元のオブジェクトからメンバー変数すべてのディープ・コピーが取られ、新しい元にデータが取り込まれます。
WSDL で配列内で使用する複合型を記述すると、WSDL2Ws ツールにより「_Array」というサフィックスが付いた複合名の型を使用して、対応する配列オブジェクトが生成されます。