Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Sanal tanıtıcıyı yerel bir türe eklemek için kullanılabilen otomatik kaynak yönetimi (auto_ptr Sınıfı gibi).
Sözdizimi
template<typename _element_type>
class auto_gcroot;
Parametreler
_element_type
Eklenecek yönetilen tür.
Üyeler
Ortak oluşturucular
| Veri Akışı Adı | Açıklama |
|---|---|
| auto_gcroot::auto_gcroot |
auto_gcroot Oluşturucu. |
| auto_gcroot::~auto_gcroot | Yok auto_gcroot edici. |
Genel yöntemler
| Veri Akışı Adı | Açıklama |
|---|---|
| auto_gcroot::attach | Nesneye ekleme auto_gcroot . |
| auto_gcroot::get | Kapsanan nesneyi alır. |
| auto_gcroot::release | Nesnesini yönetimden auto_gcroot serbest bırakır. |
| auto_gcroot::reset | Geçerli sahip olunan nesneyi yok edin ve isteğe bağlı olarak yeni bir nesneye sahip olun. |
| auto_gcroot::swap | Nesneleri başka bir auto_gcrootile değiştirir. |
Genel işleçler
| Veri Akışı Adı | Açıklama |
|---|---|
auto_gcroot::operator-> |
Üye erişim işleci. |
| auto_gcroot::operator= | Atama işleci. |
| auto_gcroot::operator auto_gcroot | ve uyumlu türler arasında auto_gcroot tür atama işleci. |
| auto_gcroot::operator bool | Koşullu ifadede kullanmak auto_gcroot için işleç. |
| auto_gcroot::operator! | Koşullu ifadede kullanmak auto_gcroot için işleç. |
Gereksinimler
Üst bilgi dosyası<msclr\auto_gcroot.h>
Ad alanı msclr
auto_gcroot::auto_gcroot
auto_gcroot Oluşturucu.
auto_gcroot(
_element_type _ptr = nullptr
);
auto_gcroot(
auto_gcroot<_element_type> & _right
);
template<typename _other_type>
auto_gcroot(
auto_gcroot<_other_type> & _right
);
Parametreler
_ptr
Sahip olunacak nesne.
_Sağ
Mevcut auto_gcrootbir .
Açıklamalar
Var olan auto_gcrootbir öğesinden oluştururkenauto_gcroot, var olan auto_gcroot nesnenin sahipliğini yeni auto_gcrootöğesine aktarmadan önce nesnesini serbest bırakır.
Örnek
// msl_auto_gcroot_auto_gcroot.cpp
// compile with: /clr
#include <msclr\auto_gcroot.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 );
}
};
class ClassA { //unmanaged class
private:
auto_gcroot<RefClassA^> m_a;
public:
ClassA() : m_a( gcnew RefClassA( "unmanaged" ) ) {}
~ClassA() {} //no need to delete m_a
void DoSomething() {
m_a->PrintHello();
}
};
int main()
{
{
ClassA a;
a.DoSomething();
} // a.m_a is automatically destroyed as a goes out of scope
{
auto_gcroot<RefClassA^> a(gcnew RefClassA( "first" ) );
a->PrintHello();
}
{
auto_gcroot<RefClassB^> b(gcnew RefClassB( "second" ) );
b->PrintHello();
auto_gcroot<RefClassA^> a(b); //construct from derived type
a->PrintHello();
auto_gcroot<RefClassA^> a2(a); //construct from same type
a2->PrintHello();
}
Console::WriteLine("done");
}
in RefClassA constructor: unmanaged
Hello from unmanaged A!
in RefClassA destructor: unmanaged
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_gcroot::~auto_gcroot
Yok auto_gcroot edici.
~auto_gcroot();
Açıklamalar
Yıkıcı ayrıca sahip olunan nesneyi de yok eder.
Örnek
// msl_auto_gcroot_dtor.cpp
// compile with: /clr
#include <msclr\auto_gcroot.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_gcroot<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_gcroot::attach
Nesneye ekleme auto_gcroot .
auto_gcroot<_element_type> & attach(
_element_type _right
);
auto_gcroot<_element_type> & attach(
auto_gcroot<_element_type> & _right
);
template<typename _other_type>
auto_gcroot<_element_type> & attach(
auto_gcroot<_other_type> & _right
);
Parametreler
_Sağ
Eklenecek nesne veya auto_gcroot eklenecek nesneyi içeren bir nesne.
Dönüş değeri
Geçerli auto_gcroot.
Açıklamalar
ise _rightauto_gcroot, nesne geçerli auto_gcrootöğesine eklenmeden önce nesnesinin sahipliğini serbest bırakır.
Örnek
// msl_auto_gcroot_attach.cpp
// compile with: /clr
#include <msclr\auto_gcroot.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_gcroot<ClassA^> a( gcnew ClassA( "first" ) );
a->PrintHello();
a.attach( gcnew ClassA( "second" ) ); // attach same type
a->PrintHello();
ClassA^ ha = gcnew ClassA( "third" );
a.attach( ha ); // attach raw handle
a->PrintHello();
auto_gcroot<ClassB^> b( gcnew ClassB("fourth") );
b->PrintHello();
a.attach( b ); // attach derived type
a->PrintHello();
}
in ClassA constructor:first
Hello from first A!
in ClassA constructor:second
in ClassA destructor:first
Hello from second A!
in ClassA constructor:third
in ClassA destructor:second
Hello from third A!
in ClassA constructor:fourth
Hello from fourth B!
in ClassA destructor:third
Hello from fourth A!
in ClassA destructor:fourth
auto_gcroot::get
Kapsanan nesneyi alır.
_element_type get() const;
Dönüş değeri
İçerilen nesne.
Örnek
// msl_auto_gcroot_get.cpp
// compile with: /clr
#include <msclr\auto_gcroot.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_gcroot<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_gcroot::release
Nesnesini yönetimden auto_gcroot serbest bırakır.
_element_type release();
Dönüş değeri
Serbest bırakılan nesne.
Örnek
// msl_auto_gcroot_release.cpp
// compile with: /clr
#include <msclr\auto_gcroot.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_gcroot<ClassA^> agc1 = gcnew ClassA( "first" );
auto_gcroot<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_gcroot::reset
Geçerli sahip olunan nesneyi yok edin ve isteğe bağlı olarak yeni bir nesneye sahip olun.
void reset(
_element_type _new_ptr = nullptr
);
Parametreler
_new_ptr
(İsteğe bağlı) Yeni nesne.
Örnek
// msl_auto_gcroot_reset.cpp
// compile with: /clr
#include <msclr\auto_gcroot.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_gcroot<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_gcroot::swap
Nesneleri başka bir auto_gcrootile değiştirir.
void swap(
auto_gcroot<_element_type> & _right
);
Parametreler
_Sağ
auto_gcroot Nesneleri değiştirebileceğiniz.
Örnek
// msl_auto_gcroot_swap.cpp
// compile with: /clr
#include <msclr\auto_gcroot.h>
using namespace System;
using namespace msclr;
int main() {
auto_gcroot<String^> s1 = "string one";
auto_gcroot<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_gcroot::operator->
Üye erişim işleci.
_element_type operator->() const;
Dönüş değeri
tarafından auto_gcrootsarmalanan nesne.
Örnek
// msl_auto_gcroot_op_arrow.cpp
// compile with: /clr
#include <msclr\auto_gcroot.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_gcroot<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_gcroot::operator=
Atama işleci.
auto_gcroot<_element_type> & operator=(
_element_type _right
);
auto_gcroot<_element_type> & operator=(
auto_gcroot<_element_type> & _right
);
template<typename _other_type>
auto_gcroot<_element_type> & operator=(
auto_gcroot<_other_type> & _right
);
Parametreler
_Sağ
Nesne veya auto_gcroot geçerli auto_gcrootöğesine atanacak.
Dönüş değeri
Şu anda sahip olduğu auto_gcrootgeçerli _right.
Örnek
// msl_auto_gcroot_operator_equals.cpp
// compile with: /clr
#include <msclr\auto_gcroot.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_gcroot<ClassA^> a;
auto_gcroot<ClassA^> a2(gcnew ClassA( "first" ) );
a = a2; // assign from same type
a->PrintHello();
ClassA^ ha = gcnew ClassA( "second" );
a = ha; // assign from raw handle
auto_gcroot<ClassB^> b(gcnew ClassB( "third" ) );
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
in ClassA destructor: first
in ClassA constructor: third
Hello from third B!
in ClassA destructor: second
Hello from third A!
done
in ClassA destructor: third
auto_gcroot::operator auto_gcroot
ve uyumlu türler arasında auto_gcroot tür atama işleci.
template<typename _other_type>
operator auto_gcroot<_other_type>();
Dönüş değeri
Geçerli auto_gcroot atama olarak auto_gcroot<_other_type>.
Örnek
// msl_auto_gcroot_op_auto_gcroot.cpp
// compile with: /clr
#include <msclr\auto_gcroot.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_gcroot<ClassB^> b = gcnew ClassB("first");
b->PrintHello();
auto_gcroot<ClassA^> a = (auto_gcroot<ClassA^>)b;
a->PrintHello();
}
Hello from first B!
Hello from first A!
auto_gcroot::operator bool
Koşullu ifadede kullanmak auto_gcroot için işleç.
operator bool() const;
Dönüş değeri
true sarmalanan nesne geçerliyse; false yoksa.
Açıklamalar
Bu işleç aslında tam sayı türüne _detail_class::_safe_booldönüştürülemediğinden daha bool güvenli olan öğesine dönüştürür.
Örnek
// msl_auto_gcroot_operator_bool.cpp
// compile with: /clr
#include <msclr\auto_gcroot.h>
using namespace System;
using namespace msclr;
int main() {
auto_gcroot<String^> s;
if ( s ) Console::WriteLine( "s is valid" );
if ( !s ) Console::WriteLine( "s is invalid" );
s = "something";
if ( s ) Console::WriteLine( "now s is valid" );
if ( !s ) Console::WriteLine( "now s is invalid" );
s.reset();
if ( s ) Console::WriteLine( "now s is valid" );
if ( !s ) Console::WriteLine( "now s is invalid" );
}
s is invalid
now s is valid
now s is invalid
auto_gcroot::operator!
Koşullu ifadede kullanmak auto_gcroot için işleç.
bool operator!() const;
Dönüş değeri
true sarmalanan nesne geçersizse; false yoksa.
Örnek
// msl_auto_gcroot_operator_not.cpp
// compile with: /clr
#include <msclr\auto_gcroot.h>
using namespace System;
using namespace msclr;
int main() {
auto_gcroot<String^> s;
if ( s ) Console::WriteLine( "s is valid" );
if ( !s ) Console::WriteLine( "s is invalid" );
s = "something";
if ( s ) Console::WriteLine( "now s is valid" );
if ( !s ) Console::WriteLine( "now s is invalid" );
s.reset();
if ( s ) Console::WriteLine( "now s is valid" );
if ( !s ) Console::WriteLine( "now s is invalid" );
}
s is invalid
now s is valid
now s is invalid