2016-01-23 77 views
-1

我对C++比较陌生,想采用现代实践。我一直在试图理解的时候,最好sink一个unique_ptr,这里是一些代码,我有:什么时候接收unique_ptr

class SomeClass 
{ 
    ... 

private: 
    unique_ptr<QStaticText> _text; 
} 


{ 
    ... 

    void SomeClass::setText(unique_ptr<QStaticText> newText) 
    { 
     _text = move(newText); 
    } 

    void SomeClass::setText(const QStaticText& newText) 
    { 
     _text = make_unique<QStaticText>(newText); 
    } 

    ... 
} 

我应该更喜欢一个比其他任何一个或另一个?

+1

第二个应该是首选。但是为什么你不能直接拥有'QStaticText'成员还有点不清楚。 –

+0

你的例子很糟糕,但总的想法是,当你想要转移所有权时,你接受或返回'unique_ptr'。当传输的资源无法复制(不可复制,昂贵,完整类型未知)时,这一点尤其重要,这也是您的示例如此糟糕的原因。如果您可以复制并分配'QStaticText',请不要使用指针。通常,避免使用'new',尽管它可能与Qt略有不同。 –

+0

阅读Herb Sutter:智能指针参数:http://herbsutter.com/2013/06/05/gotw-91-solution-smart-pointer-parameters/ –

回答

0

参考QStaticText的界面,目前还不清楚为什么你使用指针(智能或其他)。 (我相信panta rei在评论中也注明了这一点。)看看Why Should I Use a Pointer Rather Than the Object Itself

在这种情况下,它可能是最好能有这样的事情:

class SomeClass 
{ 
    ... 

private: 
    QStaticText _text; 
}; 


template<class Text> 
void SomeClass::setText(const Text &newText) 
{ 
    _text = QStaticText(newText); 
} 

注意以下几点:

  1. QStaticText只是偶发的变化进行了优化。

  2. 它可以由至少两种不同类型构造。

很难看出您现在的计划获得了什么。对于每次更新,无论如何你都要创建多个对象,并且你不能重用它们(你将内容移出它们)。

+0

太棒了,所以不同的方法是:class SomeClass { ... private: QString _text; } { ... 空隙SomeClass的::的setText(常量的QString&newText) { _text = QStaticText(newText); } ... } –

+0

@PeterSpencer是;我写的只是一个略微的泛化,因为它可以采用'QString'或'QStaticText'。至于你原来的q。去,但 - 我认为你目前的建议比原来的更好。 –

相关问题