Udostępnij za pośrednictwem


Klasy zasad kopii ATL

Kopiuj zasady klasy są Narzędzie klasy używane do inicjowania, kopiowanie i usuwanie danych.Kopia zasad klasy pozwalają określić semantykę kopii dla dowolnego typu danych oraz określenie konwersje między różnymi typami danych.

Używa kopii zasady klasy ATL w jego implementacji następujących szablonów:

Przez enkapsulacji informacji potrzebnych do skopiowania lub przekonwertować dane klasy kopia zasad przekazaną jako argument szablonu, deweloperzy ATL zostały przewidziane extreme przydatności tych klas.Na przykład trzeba zaimplementować zbiór danych dowolnego typu, wystarczy podać jest kopia odpowiednie zasady; nigdy nie należy dotykać kod, który implementuje kolekcji.

Definicja

Z definicji klasy, która zapewnia następujące funkcje statyczny jest klasa zasad kopii:

static void init(DestinationType* p);

static HRESULT copy(DestinationType* pTo, const SourceType* pFrom);

static void destroy(DestinationType* p);

Można zastąpić typy DestinationType i SourceType z dowolnego typy danych dla każdej kopii zasady.

[!UWAGA]

Chociaż można zdefiniować kopii klas zasad dla wszystkich typów danych dowolnego, użycia klas w kodzie ATL należy ograniczyć typy sensu.Na przykład, gdy przy użyciu zasad kopii klasy ATL's kolekcji lub moduł wyliczający implementacji, DestinationType musi być używany jako parametr metody interfejsu COM typu.

Użyj init zainicjować danych, kopię do kopiowania danych, i zniszczyć zwolnić danych.Dokładne znaczenie inicjowania, kopiując i niszczenia są klasy Kopiuj zasady domeny i zależą od typów danych zaangażowane.

Istnieją dwa wymogi stosowania i wdrażania klasy zasad kopii:

  • Pierwszy parametr kopię tylko musi otrzymać wskaźnik do danych, które uprzednio zostały zainicjowane, korzystając z init.

  • zniszczenie tylko kiedykolwiek musi otrzymać wskaźnik do danych, które uprzednio zostały zainicjowane, korzystając z init lub kopiowane za pomocą kopię.

Standardowej implementacji

ATL oferuje dwie klasy zasad kopii w formie _Copy i _CopyInterface szablonu klasy:

  • _Copy klasy umożliwia kopiowanie tylko jednorodnej (nie konwersja między typami danych), ponieważ parametr jednego szablonu do określenia zarówno oferuje tylko DestinationType i SourceType.Rodzajowy realizacji tego szablonu nie zawiera żadnego kodu inicjowania lub niszczenia i używa memcpy , aby skopiować dane.ATL zapewnia także specjalności z _Copy dla WARIANTU, LPOLESTR, OLEVERB, i CONNECTDATA typów danych.

  • _CopyInterface klasy zapewnia implementację interfejsu wskaźniki standardowe reguły COM kopiowania.Ponownie tej klasy umożliwia tylko jednorodnej kopiowanie, więc używa prostego przydziału i wywołanie AddRef do wykonywania kopii.

Implementacje niestandardowe

Zazwyczaj trzeba definiować własne klasy zasad kopii heterogenicznych kopiowania (to znaczy, konwersja między typami danych).Niektóre przykłady kopii niestandardowych zasad klas, spójrz na pliki VCUE_Copy.h i VCUE_CopyString.h w ATLCollections próbki.Pliki te zawierają dwie klasy zasad kopię szablonu, GenericCopy i MapCopy, plus liczba specjalności z GenericCopy dla różnych typów danych.

GenericCopy

GenericCopyPozwala określić SourceType i DestinationType jako argumenty szablonu.Tutaj jest najbardziej powszechną formą GenericCopy klasy z VCUE_Copy.h:

template <class DestinationType, class SourceType = DestinationType>
class GenericCopy
{
public :
   typedef DestinationType  destination_type;
   typedef SourceType       source_type;

   static void init(destination_type* p)
   {
      _Copy<destination_type>::init(p);
   }
   static void destroy(destination_type* p)
   {
      _Copy<destination_type>::destroy(p);
   }
   static HRESULT copy(destination_type* pTo, const source_type* pFrom)
   {
      return _Copy<destination_type>::copy(pTo, const_cast<source_type*>(pFrom));
   }

}; // class GenericCopy

VCUE_Copy.h zawiera również następujące dziedziny specjalizacji tej klasy: GenericCopy<BSTR>, GenericCopy<VARIANT, BSTR>, GenericCopy<BSTR, VARIANT>.VCUE_CopyString.h zawiera specjalności kopiowania z szablonowejs: GenericCopy<std::string>, GenericCopy<VARIANT, std::string>, i GenericCopy<BSTR, std::string>.Można zwiększyć GenericCopy przez zapewnienie dalszych specjalności własny.

MapCopy

MapCopyzakłada się, że będą przechowywane mapie STL styl danych kopiowanych tak pozwala określić typ mapy, w którym przechowywane są i wpisz miejsce docelowe.Implementacji klasy używa tylko definicje TypeDef dostarczonych przez MapType klasy, aby określić typ danych źródłowych i wywoływać odpowiedni GenericCopy klasy.Potrzebne są nie specjalności tej klasy.

template <class MapType, class DestinationType = MapType::referent_type>
class MapCopy
{
public :
   typedef DestinationType          destination_type;
   typedef typename MapType::value_type     source_type;

   typedef MapType                  map_type;
   typedef typename MapType::referent_type  pseudosource_type;

   static void init(destination_type* p)
   {
      GenericCopy<destination_type, pseudosource_type>::init(p);
   }
   static void destroy(destination_type* p)
   {
      GenericCopy<destination_type, pseudosource_type>::destroy(p);
   }
   static HRESULT copy(destination_type* pTo, const source_type* pFrom)
   {
      return GenericCopy<destination_type, pseudosource_type>::copy(pTo, &(pFrom->second));
   }

}; // class MapCopy

Zobacz też

Koncepcje

Kolekcja opartych na STL wykonawczych

ATLCollections próbki.