В наши дни найти достойную документацию гораздо сложнее, чем 10 лет назад, поэтому я попробую свою удачу и посмотрю, помнит ли кто-нибудь правила агрегации, потому что документы MSDN не совсем понятны. В частности, я ставлю под сомнение следующее правило для внешних (агрегирующих) объектов:
Внешний объект должен вызывать свой управляющий метод IUnknown Release, если он запрашивает указатель на какой-либоинтерфейсов внутреннего объекта. Чтобы освободить этот указатель, внешний объект вызывает свой контролирующий метод AddRef IUnknown, а затем Release по указателю внутреннего объекта.
, и у него есть пример кода
// Obtaining inner object interface pointer
pUnkInner->QueryInterface(IID_ISomeInterface, &pISomeInterface);
pUnkOuter->Release();
// Releasing inner object interface pointer
pUnkOuter->AddRef();
pISomeInterface->Release();
Мой вопроссущество: это необходимо? от какого сценария он защищает? как вы реализуете это, когда указатель живет дольше, чем вызов метода?
В частности, мне интересно, если агрегирующий объект предоставляет свои интерфейсы внутренних объектов (что является всей точкой агрегации), как онсобираешься исполнить этот эталонный танец? Если объект агрегирования возвращает интерфейс к внутреннему объекту своим вызывающим, он передает владение ссылкой, он не будет знать, когда с ним покончено, и вызывающий не будет знать, имеет ли он дело с агрегатом.
(я думаю этот вопрос должен быть самодостаточным, но если раньше люди задавали вопросы, когда я задавал вопросы без конкретного кода, если вам действительно нужен я, чтобы предоставить пример кода агрегатного класса, над которым я работаюдля ответа, что я могу добавить это. ИМХО, это не должно быть необходимым и не добавляет никакой ценности к вопросу, это довольно стандартный COM, и я просто спрашиваю о правилах здесь.)