CFixedStringT: Przykład z menedżerem ciąg niestandardowy
Biblioteki ATL implementuje jeden przykład Menedżera niestandardowy ciąg używany przez klasę CFixedStringT, o nazwie CFixedStringMgr.CFixedStringTpochodzi z CStringT i implementuje ciąg, który przydziela jej danych znakowych jako część CFixedStringT sam obiekt, jak ciąg jest mniejsza niż długość określona przez t_nChars parametr szablonu CFixedStringT.Z tym podejściem ciąg nie jest konieczne sterty, chyba że długość ciągu przekroczy rozmiar buforu stałych.Ponieważ CFixedStringT jest zawsze wykorzystania sterty przydzielić jej dane ciągu nie można użyć CAtlStringMgr jako swojego menedżera ciąg.Używa Menedżera niestandardowy ciąg (CFixedStringMgr), wdrożenia IAtlStringMgr interfejsu.Ten interfejs jest omówiona w realizacji z Menedżera ciąg niestandardowa (zaawansowane metody).
Konstruktor CFixedStringMgr przyjmuje trzy parametry:
pData: wskaźnik do środka CStringData struktury, które mają być używane.
nChars: maksymalna liczba znaków CStringData struktury może pomieścić.
pMgr: wskaźnik do IAtlStringMgr interfejsu "Menedżer kopii zapasowej ciąg".
Konstruktor przechowuje wartości z pData i pMgr w ich odpowiednich zmiennych (m_pData i m_pMgr).Następnie ustawia długość buforu zero dostępne długości równej maksymalny rozmiar buforu stałych i liczbę odwołań do –1.Wartość odniesienia licznik wskazuje bufor jest zablokowany i używania tego wystąpienia CFixedStringMgr jako Menedżer ciąg.
Bufor znakowania zablokowane uniemożliwia innych CStringT wystąpień z gospodarstwa udostępnionego odwołanie do buforu.Jeśli inne CStringT wystąpienia zostały dozwolone udostępnianie buforu byłoby możliwe buforu zawartych przez CFixedStringT do usunięcia, podczas gdy inne ciągi nadal przy użyciu buforu.
CFixedStringMgr jest pełne wykonanie IAtlStringMgr interfejsu.Realizacji każdej metody omówione.
Wdrożenie CFixedStringMgr::Allocate
Wykonania CFixedStringMgr::Allocate sprawdza pierwszy, jeśli żądany rozmiar ciąg jest mniejsza niż rozmiar buforu stałych (przechowywane w m_pData Członkowskich).Jeśli bufor stałych jest na tyle duża CFixedStringMgr blokuje stałych bufor o długości zero.Jak długość ciągu nie uprawiają poza rozmiar buforu stałych, CStringT nie będą do ponownego przydzielenia buforu.
Jeśli żądany rozmiar ciągu jest większa niż stałe buforu CFixedStringMgr przesyła żądanie do Menedżera ciąg kopii zapasowej.Przyjmuje się, że Menedżer kopii zapasowej ciąg przydzielić buforu ze sterty.Jednak przed zwróceniem bufor CFixedStringMgr blokuje buforu i zamienia buforu ciągu Menedżer wskaźnik wskaźnik do CFixedStringMgr obiektu.Gwarantuje to, że próbuje zmienić alokację lub zwolnić buforu przez CStringT będzie wzywać do CFixedStringMgr.
Wdrożenie CFixedStringMgr::ReAllocate
Wykonania CFixedStringMgr::ReAllocate jest bardzo podobna do realizacji Allocate.
Jeśli bufor jest ponownie przydzielona jest stałe buforu i rozmiar buforu żądana jest mniejszy niż stałe buforu, alokacji nie jest wykonywane.Jednak jeśli bufor jest ponownie przydzielona nie jest stały buforu, musi być przydzielone z kopii zapasowej Menedżera buforu.W takim przypadku kopii zapasowej Menedżera służy do ponownego przydzielenia buforu.
Jeśli bufor jest ponownie przydzielona jest stałe buforu i nowy rozmiar buforu jest za długi do umieszczenia w ramach ustalonego bufora CFixedStringMgr alokuje bufor nowej kopii zapasowej Menedżera.Zawartość buforu stałych następnie są kopiowane do nowego buforu.
Wdrożenie CFixedStringMgr::Free
Wykonania CFixedStringMgr::Free wynika z tej samej strukturze jako Allocate i ReAllocate.Jeśli bufor zwalniana jest stałe buforu, metoda ustawia go do buforu zablokowane zerowej długości.Jeśli bufor zwalniana została przydzielona z kopii zapasowej Menedżera CFixedStringMgr używa kopii zapasowej Menedżera zwolnić go.
Wdrożenie CFixedStringMgr::Clone
Wykonania CFixedStringMgr::Clone zawsze zwraca wskaźnik do kopii zapasowej Menedżera raczej niż CFixedStringMgr sobie.Dzieje się tak ponieważ każde wystąpienie CFixedStringMgr można tylko skojarzony z pojedynczym wystąpieniem CStringT.Wszystkie inne wystąpienia CStringT próby sklonować Menedżera należy uzyskać kopii zapasowej Menedżera zamiast.Wynika to z kopii zapasowej Menedżera obsługuje udostępnionych.
Wdrożenie CFixedStringMgr::GetNilString
Wykonania CFixedStringMgr::GetNilString zwraca ustalonego bufora.Z uwagi na żywo Korespondencja CFixedStringMgr i CStringT, danego wystąpienia CStringT nigdy nie użyje więcej niż jeden bufor naraz.Dlatego ciąg zerowe i buforu ciągów real nigdy nie potrzebne są w tym samym czasie.
W każdym przypadku, gdy bufor stałych nie jest używany, CFixedStringMgr zapewnia, że jest inicjowany z zerowej długości.Umożliwia on być użyty jako ciąg nil.Dodatkowym atutem nAllocLength Członkowskich ustalonego bufora jest zawsze ustawiany na pełny rozmiar buforu stałych.Oznacza to, że CStringT można powiększać ciąg bez wywołania IAtlStringMgr::Reallocate, nawet dla ciągu nil.
Wymagania
Nagłówek: cstringt.h