2012-01-04 47 views
1

资我具有从enable_shared_from_this派生的类和其通过调用shared_from_this返回一个共享指针()的方法。我想在该方法中检测对象是否由shared_ptr拥有,如果不是抛出。我试过这样的事情:检测是否一个目的是通过一个智能指针

shared_ptr<T> getPointer() { 
    shared_ptr<T> ptr(shared_from_this())); 
    if(!ptr) 
     throw "Not owned by smart pointer" 
    return ptr; 
} 

虽然这不起作用,因为在构建ptr期间引发了一个糟糕的弱指针异常。有没有另一种方法。在标准接口

+1

你不能捕获异常? – jterrace 2012-01-04 23:05:05

+2

对不起,我可能是愚蠢的,但它听起来像是你没有一个问题:你想扔在某种情况异常,然后你发现一个异常已经在这种情况下抛出,所以你实际上并不需要做任何特别的事情。没有? – ruakh 2012-01-04 23:09:47

+0

我真的不喜欢在图书馆尝试catch块。就像应用程序的包装一样。 – stas 2012-01-04 23:11:20

回答

3

看,我什么都看不到它会做一个体面的测试。当然,你总是可以破解解决该问题:

std::shared_ptr<T> getPointer() { 
    try { 
     return this->shared_from_this()); 
    } 
    catch (std::bad_weak_ptr const&) { 
     throw std::runtime_error("not owned by smart pointer"); 
    } 
} 

当然,你可能也只是没有赶上std::bad_weak_ptr异常,并有原始异常逃离功能。

顺便说一句,抛出exceptin当trongly建议抛出从std::exception派生的异常。如果你曾经有一个例外,你什么都不知道你会骂人谁创造了它,因为它并不总是很容易通过设置断点来获取异常的保持,找出它是什么(尽管调试器可以帮助,如果有必要的家伙指向抛出异常的内部函数)。只写what()的结果要容易得多。

+0

正如我在上面的评论中提到的,我尽量避免在图书馆方面尝试捕捉。我知道这个例外。这只是SO的简写。实际的代码抛出一个std :: runtime_error。 – stas 2012-01-04 23:15:06

3

一个主叫shared_from_this()为对象t的先决条件之一是“必须存在至少一个shared_ptr实例p拥有t”(见the Boost documentation)。 C++ 11规范enable_shared_from_this具有相同的要求。

由于enable_shared_from_this没有其他(已记录)成员,因此无法测试从enable_shared_from_this派生的对象实际上是否由shared_ptr拥有。

也就是说,为了清楚起见,仅当该类型的对象始终归属于shared_ptr时,最好从enable_shared_from_this派生。这样就没有混淆。

+0

但是没有办法明确强制执行,但是。最接近的是使构造函数是私有的,并且使工厂方法返回一个指向该对象的智能指针。 – stas 2012-01-04 23:17:57

+3

这是正确的。 – 2012-01-04 23:18:33

相关问题