mercredi 1 décembre 2010

QT se déchaine avec ses smart pointers C++ : Les Qpointers

QT Nokia la librairie C++ qui fait fort, propose différents types de smart pointeurs C++.

Rappel : les "smarts pointeurs" sont des objets c++ alloués sur la pile du thread courant qui gère le cycle de vie d'un objet alloué sur le tas (ou heap).

On peut citer le :
- QPointer destiné à pointer des objets en relation "1 to 1" (sans compteur de référence)
- QSharedPointer destiné à partager son pointage avec d'autres smart pointeurs (relation 1 to n).
Avec Qt pour votre classe puisse être "smart pointable" (désolé), il vous faut la faire dériver de QObject la classe mère de l'architecture Qt.

Exemple de source :
// Seule une classe héritant de QObject
// peut être pointée par le QPointer

class X : public QObject {
  private:
    int _i;
public:
    X(int ii) : _i(ii) {}
    operator int() { return _i; }
    virtual ~X() {}
};

Dans ce cas voici un petit exemple improvisé d'utilisation des smart pointeurs de la librairie.

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    // Smart pointer vers un objet (relation 1 to 1)
    QPointer<X> sp( new X(1) );
    QPointer<X> sp2( new X(2) );
    qDebug() << "sp._i = " << sp->operator int();
    qDebug() << "sp2._i = " << sp2->operator int();
    sp = sp2; // les 2 smart pointers pointent vers le même objet
    qDebug() << "sp._i = " << sp->operator int();
    qDebug() << "sp2._i = " << sp2->operator int();
    // Smart pointeurs avec un compteur de référence
    QSharedPointer<X> sp3( new X(3) );
    QSharedPointer<X> sp4( sp3 );
    qDebug() << "sp3._i = " << sp3->operator int();
    qDebug() << "sp4._i = " << sp4->operator int();
    qDebug() << "FIN";
    return a.exec();
}
Après avoir fait quelques petits tests de performance les smarts pointers proposés par boost sont plus performants (cpu).

Aucun commentaire:

Enregistrer un commentaire