Есть этот код:
#include <iostream>
class CleverClass{
public:
CleverClass() : number(55){}
void cleverOperation(){
std::cout << number << std::endl;
}
private:
int number;
};
class NotCleverClass{
public:
NotCleverClass(CleverClass* cc) : cleverClass(cc){}
void callCleverOperation(){
// throw exception when cleverClass object doesn't exist anymore
cleverClass->cleverOperation();
}
private:
CleverClass* cleverClass;
};
NotCleverClass returnNCC(){
CleverClass CC;
NotCleverClass NCC(&CC);
NCC.callCleverOperation(); // prints 55
return NCC;
}
int main()
{
NotCleverClass returnedNCC = returnNCC();
returnedNCC.callCleverOperation(); // prints -858993460
return 0;
}
Объект класса NotCleverClass зависит от объекта класса CleverClass. Когда объект класса CleverClass существует, тогда объект класса NotCleverClass может использовать свою функцию cleverOperation (), и все работает хорошо. Однако, когда объект класса CleverClass потеряет существование, вызов его функции может вызвать проблемы.
Одним из решений является сохранение в NotCleverClass слабого указателя (boost :: weak_ptr) объекта CleverClass с помощью средства проверки ссылок, но все еще существует проблема, когда объект cleverClass не будет помещен в свободное хранилище (например, в стек). Существуют ли какие-либо шаблоны проектирования, позволяющие отслеживать, существует ли еще используемый объект и имеет ли смысл вызывать его функции?