Classe auto_handle
Gestione automatica delle risorse, che può essere usata per incorporare un handle virtuale in un tipo gestito.
Sintassi
template<typename _element_type>
ref class auto_handle;
Parametri
_element_type
Tipo gestito da incorporare.
Membri
Costruttori pubblici
Nome | Descrizione |
---|---|
auto_handle::auto_handle | auto_handle Costruttore. |
auto_handle::~auto_handle | Distruttore auto_handle . |
Metodi pubblici
Nome | Descrizione |
---|---|
auto_handle::get | Ottiene l'oggetto contenuto. |
auto_handle::release | Rilascia l'oggetto dalla auto_handle gestione. |
auto_handle::reset | Eliminare definitivamente l'oggetto di proprietà corrente e, facoltativamente, acquisire il possesso di un nuovo oggetto. |
auto_handle::swap | Scambia oggetti con un altro auto_handle oggetto . |
Operatori pubblici
Nome | Descrizione |
---|---|
auto_handle::operator-> |
Operatore di accesso ai membri. |
auto_handle::operator= | Operatore di assegnazione. |
auto_handle::operator auto_handle | Operatore cast di tipi tra auto_handle e tipi compatibili. |
auto_handle::operator bool | Operatore per l'uso auto_handle in un'espressione condizionale. |
auto_handle::operator! | Operatore per l'uso auto_handle in un'espressione condizionale. |
Requisiti
File<di intestazione msclr\auto_handle.h>
Spazio dei nomi msclr
auto_handle::auto_handle
auto_handle
Costruttore.
auto_handle();
auto_handle(
_element_type ^ _ptr
);
auto_handle(
auto_handle<_element_type> % _right
);
template<typename _other_type>
auto_handle(
auto_handle<_other_type> % _right
);
Parametri
_ptr
Oggetto da possedere.
_A destra
Oggetto auto_handle
esistente.
Esempio
// msl_auto_handle_auto_handle.cpp
// compile with: /clr
#include "msclr\auto_handle.h"
using namespace System;
using namespace msclr;
ref class RefClassA {
protected:
String^ m_s;
public:
RefClassA(String^ s) : m_s(s) {
Console::WriteLine( "in RefClassA constructor: " + m_s );
}
~RefClassA() {
Console::WriteLine( "in RefClassA destructor: " + m_s );
}
virtual void PrintHello() {
Console::WriteLine( "Hello from {0} A!", m_s );
}
};
ref class RefClassB : RefClassA {
public:
RefClassB( String^ s ) : RefClassA( s ) {}
virtual void PrintHello() new {
Console::WriteLine( "Hello from {0} B!", m_s );
}
};
int main()
{
{
auto_handle<RefClassA> a(gcnew RefClassA( "first" ) );
a->PrintHello();
}
{
auto_handle<RefClassB> b(gcnew RefClassB( "second" ) );
b->PrintHello();
auto_handle<RefClassA> a(b); //construct from derived type
a->PrintHello();
auto_handle<RefClassA> a2(a); //construct from same type
a2->PrintHello();
}
Console::WriteLine("done");
}
in RefClassA constructor: first
Hello from first A!
in RefClassA destructor: first
in RefClassA constructor: second
Hello from second B!
Hello from second A!
Hello from second A!
in RefClassA destructor: second
done
auto_handle::~auto_handle
Distruttore auto_handle
.
~auto_handle();
Osservazioni:
Il distruttore destruisce anche l'oggetto di proprietà.
Esempio
// msl_auto_handle_dtor.cpp
// compile with: /clr
#include "msclr\auto_handle.h"
using namespace System;
using namespace msclr;
ref class ClassA {
public:
ClassA() { Console::WriteLine( "ClassA constructor" ); }
~ClassA() { Console::WriteLine( "ClassA destructor" ); }
};
int main()
{
// create a new scope for a:
{
auto_handle<ClassA> a = gcnew ClassA;
}
// a goes out of scope here, invoking its destructor
// which in turns destructs the ClassA object.
Console::WriteLine( "done" );
}
ClassA constructor
ClassA destructor
done
auto_handle::get
Ottiene l'oggetto contenuto.
_element_type ^ get();
Valore restituito
Oggetto contenuto.
Esempio
// msl_auto_handle_get.cpp
// compile with: /clr
#include "msclr\auto_handle.h"
using namespace System;
using namespace msclr;
ref class ClassA {
String^ m_s;
public:
ClassA( String^ s ) : m_s( s ){
Console::WriteLine( "in ClassA constructor:" + m_s );
}
~ClassA() {
Console::WriteLine( "in ClassA destructor:" + m_s );
}
void PrintHello() {
Console::WriteLine( "Hello from {0} A!", m_s );
}
};
void PrintA( ClassA^ a ) {
a->PrintHello();
}
int main() {
auto_handle<ClassA> a = gcnew ClassA( "first" );
a->PrintHello();
ClassA^ a2 = a.get();
a2->PrintHello();
PrintA( a.get() );
}
in ClassA constructor:first
Hello from first A!
Hello from first A!
Hello from first A!
in ClassA destructor:first
auto_handle::release
Rilascia l'oggetto dalla auto_handle
gestione.
_element_type ^ release();
Valore restituito
Oggetto rilasciato.
Esempio
// msl_auto_handle_release.cpp
// compile with: /clr
#include <msclr\auto_handle.h>
using namespace System;
using namespace msclr;
ref class ClassA {
String^ m_s;
public:
ClassA( String^ s ) : m_s( s ) {
Console::WriteLine( "ClassA constructor: " + m_s );
}
~ClassA() {
Console::WriteLine( "ClassA destructor: " + m_s );
}
void PrintHello() {
Console::WriteLine( "Hello from {0} A!", m_s );
}
};
int main()
{
ClassA^ a;
// create a new scope:
{
auto_handle<ClassA> agc1 = gcnew ClassA( "first" );
auto_handle<ClassA> agc2 = gcnew ClassA( "second" );
a = agc1.release();
}
// agc1 and agc2 go out of scope here
a->PrintHello();
Console::WriteLine( "done" );
}
ClassA constructor: first
ClassA constructor: second
ClassA destructor: second
Hello from first A!
done
auto_handle::reset
Eliminare definitivamente l'oggetto di proprietà corrente e, facoltativamente, acquisire il possesso di un nuovo oggetto.
void reset(
_element_type ^ _new_ptr
);
void reset();
Parametri
_new_ptr
(Facoltativo) Nuovo oggetto.
Esempio
// msl_auto_handle_reset.cpp
// compile with: /clr
#include <msclr\auto_handle.h>
using namespace System;
using namespace msclr;
ref class ClassA {
String^ m_s;
public:
ClassA( String^ s ) : m_s( s ) {
Console::WriteLine( "ClassA constructor: " + m_s );
}
~ClassA() {
Console::WriteLine( "ClassA destructor: " + m_s );
}
void PrintHello() {
Console::WriteLine( "Hello from {0} A!", m_s );
}
};
int main()
{
auto_handle<ClassA> agc1 = gcnew ClassA( "first" );
agc1->PrintHello();
ClassA^ ha = gcnew ClassA( "second" );
agc1.reset( ha ); // release first object, reference second
agc1->PrintHello();
agc1.reset(); // release second object, set to nullptr
Console::WriteLine( "done" );
}
ClassA constructor: first
Hello from first A!
ClassA constructor: second
ClassA destructor: first
Hello from second A!
ClassA destructor: second
done
auto_handle::swap
Scambia oggetti con un altro auto_handle
oggetto .
void swap(
auto_handle<_element_type> % _right
);
Parametri
_A destra
Oggetto auto_handle
con cui scambiare oggetti.
Esempio
// msl_auto_handle_swap.cpp
// compile with: /clr
#include <msclr\auto_handle.h>
using namespace System;
using namespace msclr;
int main() {
auto_handle<String> s1 = "string one";
auto_handle<String> s2 = "string two";
Console::WriteLine( "s1 = '{0}', s2 = '{1}'",
s1->ToString(), s2->ToString() );
s1.swap( s2 );
Console::WriteLine( "s1 = '{0}', s2 = '{1}'",
s1->ToString(), s2->ToString() );
}
s1 = 'string one', s2 = 'string two'
s1 = 'string two', s2 = 'string one'
auto_handle::operator->
Operatore di accesso ai membri.
_element_type ^ operator->();
Valore restituito
Oggetto di cui è stato eseguito il wrapping da auto_handle
.
Esempio
// msl_auto_handle_op_arrow.cpp
// compile with: /clr
#include <msclr\auto_handle.h>
using namespace System;
using namespace msclr;
ref class ClassA {
protected:
String^ m_s;
public:
ClassA( String^ s ) : m_s( s ) {}
virtual void PrintHello() {
Console::WriteLine( "Hello from {0} A!", m_s );
}
int m_i;
};
int main() {
auto_handle<ClassA> a( gcnew ClassA( "first" ) );
a->PrintHello();
a->m_i = 5;
Console::WriteLine( "a->m_i = {0}", a->m_i );
}
Hello from first A!
a->m_i = 5
auto_handle::operator=
Operatore di assegnazione.
auto_handle<_element_type> % operator=(
auto_handle<_element_type> % _right
);
template<typename _other_type>
auto_handle<_element_type> % operator=(
auto_handle<_other_type> % _right
);
Parametri
_A destra
Oggetto auto_handle
da assegnare all'oggetto corrente auto_handle
.
Valore restituito
Oggetto corrente auto_handle
proprietario di _right
.
Esempio
// msl_auto_handle_op_assign.cpp
// compile with: /clr
#include <msclr\auto_handle.h>
using namespace System;
using namespace msclr;
ref class ClassA {
protected:
String^ m_s;
public:
ClassA(String^ s) : m_s(s) {
Console::WriteLine( "in ClassA constructor: " + m_s );
}
~ClassA() {
Console::WriteLine( "in ClassA destructor: " + m_s );
}
virtual void PrintHello() {
Console::WriteLine( "Hello from {0} A!", m_s );
}
};
ref class ClassB : ClassA {
public:
ClassB( String^ s ) : ClassA( s ) {}
virtual void PrintHello() new {
Console::WriteLine( "Hello from {0} B!", m_s );
}
};
int main()
{
auto_handle<ClassA> a;
auto_handle<ClassA> a2(gcnew ClassA( "first" ) );
a = a2; // assign from same type
a->PrintHello();
auto_handle<ClassB> b(gcnew ClassB( "second" ) );
b->PrintHello();
a = b; // assign from derived type
a->PrintHello();
Console::WriteLine("done");
}
in ClassA constructor: first
Hello from first A!
in ClassA constructor: second
Hello from second B!
in ClassA destructor: first
Hello from second A!
done
in ClassA destructor: second
auto_handle::operator auto_handle
Operatore cast di tipi tra auto_handle
e tipi compatibili.
template<typename _other_type>
operator auto_handle<_other_type>();
Valore restituito
Cast corrente auto_handle
in auto_handle<_other_type>
.
Esempio
// msl_auto_handle_op_auto_handle.cpp
// compile with: /clr
#include <msclr\auto_handle.h>
using namespace System;
using namespace msclr;
ref class ClassA {
protected:
String^ m_s;
public:
ClassA( String^ s ) : m_s( s ) {}
virtual void PrintHello() {
Console::WriteLine( "Hello from {0} A!", m_s );
}
};
ref class ClassB : ClassA {
public:
ClassB( String ^ s) : ClassA( s ) {}
virtual void PrintHello() new {
Console::WriteLine( "Hello from {0} B!", m_s );
}
};
int main() {
auto_handle<ClassB> b = gcnew ClassB("first");
b->PrintHello();
auto_handle<ClassA> a = (auto_handle<ClassA>)b;
a->PrintHello();
}
Hello from first B!
Hello from first A!
auto_handle::operator bool
Operatore per l'uso auto_handle
in un'espressione condizionale.
operator bool();
Valore restituito
true
se l'oggetto di cui è stato eseguito il wrapping è valido; false
altrimenti.
Osservazioni:
Questo operatore viene effettivamente convertito in _detail_class::_safe_bool
che è più sicuro di bool
perché non può essere convertito in un tipo integrale.
Esempio
// msl_auto_handle_operator_bool.cpp
// compile with: /clr
#include <msclr\auto_handle.h>
using namespace System;
using namespace msclr;
int main() {
auto_handle<String> s1;
auto_handle<String> s2 = "hi";
if ( s1 ) Console::WriteLine( "s1 is valid" );
if ( !s1 ) Console::WriteLine( "s1 is invalid" );
if ( s2 ) Console::WriteLine( "s2 is valid" );
if ( !s2 ) Console::WriteLine( "s2 is invalid" );
s2.reset();
if ( s2 ) Console::WriteLine( "s2 is now valid" );
if ( !s2 ) Console::WriteLine( "s2 is now invalid" );
}
s1 is invalid
s2 is valid
s2 is now invalid
auto_handle::operator!
Operatore per l'uso auto_handle
in un'espressione condizionale.
bool operator!();
Valore restituito
true
se l'oggetto di cui è stato eseguito il wrapping non è valido; false
altrimenti.
Esempio
// msl_auto_handle_operator_not.cpp
// compile with: /clr
#include <msclr\auto_handle.h>
using namespace System;
using namespace msclr;
int main() {
auto_handle<String> s1;
auto_handle<String> s2 = "something";
if ( s1) Console::WriteLine( "s1 is valid" );
if ( !s1 ) Console::WriteLine( "s1 is invalid" );
if ( s2 ) Console::WriteLine( "s2 is valid" );
if ( !s2 ) Console::WriteLine( "s2 is invalid" );
s2.reset();
if ( s2 ) Console::WriteLine( "s2 is now valid" );
if ( !s2 ) Console::WriteLine( "s2 is now invalid" );
}
s1 is invalid
s2 is valid
s2 is now invalid