Architecture Net



         

Ограничения на использование управляемых типов в C++ - часть 3


_gc class FriendManagedClass {};

// класс сборщика мусора FriendManagedClass используется как друг

_nogc class FriendUnmanagedClass {};

// класс FriendUnmanagedClass используется как друг

_gc class ManagedClass

// класс сборщика мусора ManagedClass

{

public:

MemberUnmanagedClass urn; //OK: внедренный неуправляемый MemberUnmanagedClass *pum; //OK: указатель на неуправляемый MemberUnmanagedClass &rum; //OK: ссылка на неуправляемый

//MemberManagedClass m; // Ошибка: не любит стека

MemberManagedClass *pm; //OK: указатель на управляемый

MemberManagedClass &rm; //OK: ссылка на управляемый

ManagedClass() : // необходим для инициализации ссылки

rm(*new MemberManagedClass), // требуется компилятором! rum(*new MemberUnmanagedClass), // требуется компилятором! pm(new MemberManagedClass) // не требуется компилятором

{}

// Ошибки: не может иметь никаких друзей // в управляемом классе //friend FriendManagedClass; // друг //friend FriendUnmanagedClass; // друг };

_nogc class UnmanagedClass

// класс UnmanagedClass

{

public:

MemberUnmanagedClass um; //OK: внедренный неуправляемый MemberUnmanagedClass *pum; //OK: указатель на неуправляемый MemberUnmanagedClass Srum; //OK: ссылка на неуправляемый

//MemberManagedClass m; // Ошибка: не любит стека

//MemberManagedClass *pm;

// Ошибка: управляемый* в неуправляемом

MemberManagedClass &rm; //OK: ссылка на управляемый (???)

UnmanagedClass() : // необходим для инициализации ссылки

rm(*new MemberManagedClass), // требуется компилятором! rum(*new MemberUnmanagedClass) // требуется компилятором!

{}

// Ошибка: нельзя объявить управляемый друг // в неуправляемом

//friend FriendManagedClass; // друг friend FriendUnmanagedClass; // друг - OK

};

_gc class SuperManagedClass {};

// класс сборщика мусора SuperManagedClass

_nogc class SuperUnmanagedClass {}; // класс SuperUnmanagedClass

// ошибка: управляемый тип не может происходить

//от неуправляемого типа

//_gc class BadSubManagedClass : SuperUnmanagedClass {};




Содержание  Назад  Вперед