C++ 当其中一个不';不再存在
有以下代码:C++ 当其中一个不';不再存在,c++,design-patterns,C++,Design Patterns,有以下代码: #include <iostream> class CleverClass{ public: CleverClass() : number(55){} void cleverOperation(){ std::cout << number << std::endl; } private: int number; }; class NotCleverClass{ public: NotCl
#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;
}
#包括
克利夫拉斯班{
公众:
CleverClass():数字(55){}
void cleveropertion(){
std::cout一种解决方案是CC
具有静态存储持续时间:
NotCleverClass returnNCC(){
static CleverClass CC; // Note the keyword static there
NotCleverClass NCC(&CC);
NCC.callCleverOperation(); // prints 55
return NCC;
}
这样,当returnNCC()时,CC
只构造一次第一次调用
,并在程序运行期间保持活动状态。即使对象具有自动存储持续时间,您仍然可以使用弱\u ptr
;您可以为共享\u ptr
提供一个自定义的删除器,该删除器不执行任何操作;并通过将其放置在与对象的作用域相同。类似于以下内容:
class NotCleverClass{
public:
NotCleverClass(weak_ptr<CleverClass> cc) : cleverClass(cc){}
void callCleverOperation(){
// throw bad_weak_ptr when cleverClass object doesn't exist anymore
shared_ptr<CleverClass>(cleverClass)->cleverOperation();
}
private:
weak_ptr<CleverClass> cleverClass;
};
struct null_delete { void operator()(void*) const {} };
NotCleverClass returnNCC(){
CleverClass CC;
shared_ptr<CleverClass> shared_cc(&CC, null_delete());
NotCleverClass NCC(shared_cc);
NCC.callCleverOperation(); // prints 55
return NCC;
// shared_cc destroyed here: NCC::cleverClass is safely invalidated
// CC destroyed here: no dangling references remain
}
class-NotCleverClass{
公众:
NotCleverClass(弱):cleverClass(cc){}
void callcleveropertion(){
//当cleverClass对象不再存在时抛出bad_weak_ptr
共享_ptr(cleverClass)->cleverOperation();
}
私人:
弱小的克利夫拉斯;
};
结构null_delete{void operator()(void*)const{};
NotCleverClass returnNCC(){
克利夫拉斯CC;
shared_ptr shared_cc(&cc,null_delete());
NotCleverClass NCC(共享抄送);
NCC.callCleverOperation();//打印55
返回NCC;
//共享_cc在此被销毁:NCC::cleverClass安全无效
//CC在此被销毁:没有悬空引用保留
}
这应该适用于Boost或C++11智能指针。在C++11中,可以用lambda替换null\u delete
函子,[](void*){}