Pracuję nad projektem, do którego odwoływano się z określonymi obiektami - to bardzo podobne ustawienie do COM. W każdym razie nasz projekt ma inteligentne wskaźniki, które zmniejszają potrzebę jawnego wywoływania funkcji Add() i Release() dla tych obiektów. Problem polega na tym, że czasami deweloperzy wciąż wywołują funkcję Release() za pomocą inteligentnego wskaźnika.Czy inteligentne wskaźniki mogą selektywnie ukrywać lub przekierowywać wywołania funkcji do obiektów, które owijają?
To, czego szukam, to metoda wywoływania funkcji Release() z inteligentnego wskaźnika, powodująca błąd kompilacji lub wykonywania. Czas kompilacji nie wydaje mi się możliwy. Myślałem, że mam rozwiązanie czasu pracy (zobacz kod poniżej), ale nie całkiem się kompiluje. Najwyraźniej niejawna konwersja nie jest dozwolona po użyciu operatora ->().
W każdym razie, czy ktoś może pomyśleć o sposobie osiągnięcia tego, co próbuję osiągnąć?
Dziękujemy za pomoc!
Kevin
#include <iostream>
#include <cassert>
using namespace std;
class A
{
public:
void Add()
{
cout << "A::Add" << endl;
}
void Release()
{
cout << "A::Release" << endl;
}
void Foo()
{
cout << "A::Foo" << endl;
}
};
template <class T>
class MySmartPtrHelper
{
T* m_t;
public:
MySmartPtrHelper(T* _t)
: m_t(_t)
{
m_t->Add();
}
~MySmartPtrHelper()
{
m_t->Release();
}
operator T&()
{
return *m_t;
}
void Add()
{
cout << "MySmartPtrHelper::Add()" << endl;
assert(false);
}
void Release()
{
cout << "MySmartPtrHelper::Release()" << endl;
assert(false);
}
};
template <class T>
class MySmartPtr
{
MySmartPtrHelper<T> m_helper;
public:
MySmartPtr(T* _pT)
: m_helper(_pT)
{
}
MySmartPtrHelper<T>* operator->()
{
return &m_helper;
}
};
int main()
{
A a;
MySmartPtr<A> pA(&a);
pA->Foo(); // this currently fails to compile. The compiler
// complains that MySmartPtrHelper::Foo() doesn't exist.
//pA->Release(); // this will correctly assert if uncommented.
return 0;
}
Czy zastąpicie przydział A "przy użyciu nowego przydziału operatora? Nie spowoduje to zmiany pierwotnego problemu, ale usunie jeden z typowych nieprzyjemnych błędów za pomocą inteligentnych wskaźników zliczających odniesienia. – sharptooth