Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当其中一个不';不再存在_C++_Design Patterns - Fatal编程技术网

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*){}