2016-01-23 3 views
-1

Je suis relativement nouveau pour C++ et que vous souhaitez adopter la pratique moderne. J'ai essayé de comprendre quand il est préférable de sink un unique_ptr, voici un code que j'ai:Quand un évier 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); 
    } 

    ... 
} 

Si je préfère un sur l'autre, que ce soit ou d'une autre?

+1

Le deuxième devrait être préféré. Mais la raison pour laquelle vous ne pouvez pas avoir directement un membre 'QStaticText' n'est pas claire. –

+0

Votre exemple est nul, mais l'idée générale est que vous acceptez ou renvoyez un 'unique_ptr' lorsque vous voulez transférer la propriété. Ceci est particulièrement important lorsque la ressource transférée ne peut pas être copiée (non imprimable, coûteuse, type complet inconnu), ce qui est également ce qui rend votre exemple si mauvais. Si vous pouvez copier et assigner un 'QStaticText', n'utilisez pas de pointeurs. En général, évitez d'utiliser 'new', bien qu'il puisse être légèrement différent avec Qt. –

+0

avoir une lecture de Herb Sutter: pointeur intelligent Paramètres: http://herbsutter.com/2013/06/05/gotw-91-solution-smart-pointer-parameters/ –

Répondre

0

Se référant à l'interface de QStaticText, on ne sait pas pourquoi vous utilisez des pointeurs (puce ou autre) du tout. (Je crois que panta rei l'a noté dans un commentaire aussi.) Jetez un oeil à Why Should I Use a Pointer Rather Than the Object Itself.

Dans ce cas, il pourrait être préférable d'avoir quelque chose comme ceci:

class SomeClass 
{ 
    ... 

private: 
    QStaticText _text; 
}; 


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

Notez les points suivants:

  1. QStaticText est juste optimisé pour les changements peu fréquents.

  2. Il est au moins constructible deux types différents.

Il est difficile de voir ce que vous gagnez grâce à votre schéma actuel. Pour chaque mise à jour, vous créez de toute façon plusieurs objets et vous ne pouvez pas les réutiliser (vous en sortez le contenu).

+0

Grand, donc une approche différente serait: classe SomeClass {... privé: QString _TEXT; } {... SomeClass vide :: setText (const QString & newText) { _TEXT = QStaticText (newText); } ...} –

+0

@PeterSpencer Oui; ce que j'ai écrit est une légère généralisation de cela, car il peut prendre un 'QString' ou un' QStaticText'. En ce qui concerne votre q d'origine. va, cependant - Je pense que votre suggestion actuelle est meilleure que l'original. –