2009-11-22 21 views
0

En lisant quelques trucs sur l'idiome Pimpl je trouve quelque chose comme ceci:Strange "classe Type :: méthode(): substance" syntaxe C++

MyClass::MyClass() : pimpl_(new MyClassImp())

Première: Qu'est-ce que cela signifie?
Deuxièmement: Quelle est la syntaxe?
Désolé d'être un tel noob.

+3

Les listes d'initialisation de constructeur sont une caractéristique de base du langage C++. C'est quelque chose que vous lisez dans votre livre de base en C++, ne posez pas de questions sur SO. – AnT

+0

désolé, je suis nouveau en C++, je viens du monde C. Je suis familier avec OOP depuis Obj-C et Delphi, mais c'était spécifique à C++. –

+0

Alors faites-vous une faveur et lisez une introduction de base à C++. Comme l'a dit Andrey, ce sont des connaissances de base. Vous ne pouvez pas apprendre efficacement la langue sans avoir une introduction de base. – sbi

Répondre

8

Ceci définit le constructeur pour MyClass.

La syntaxe est celle d'une définition de constructeur avec an initialization list (je suppose qu'il y a un ensemble d'accolades suivantes qui définissent le corps du constructeur).

Le membre pimpl_ de MyClass est en cours d'initialisation en tant que pointeur vers un nouvel objet de type MyClassImp. Il est presque le même que ce qui suit:

MyClass::MyClass() 
{ 
    pimpl_ = new MyClassImp(); 
} 

Cependant, il est préférable d'utiliser la liste d'initialisation pour initialiser les membres de la classe la mesure du possible; voir l'entrée C++ FAQ Lite ci-dessus.

+0

Merci pour la réponse rapide! Cela a éclairci les choses! Et j'ai cherché la FAQ Lite pour cela ... –

+0

+1 meilleure réponse – Klaim

2

C'est une liste d'initialisation. Il vous permet de définir les valeurs du constructeur de membre et de classe de base avant que le code du constructeur ne soit appelé.

Vous devez l'utiliser pour initialiser les valeurs de votre instance de classe.

0

En plus d'être un constructeur avec une liste d'initialisation comme d'autres l'ont déjà expliqué, il utilise également le modèle d'implémentation privée.

C++ requiert que la déclaration de classe inclue tous les membres publics et privés de la classe. Cela peut vous obliger à exposer les détails de l'implémentation dont vous ne voulez pas, et à faire de votre implémentation une partie de votre API/ABI. Il peut également augmenter considérablement les temps de compilation en raison de #includes supplémentaires dans les en-têtes publics pour prendre en charge les variables de membre privé.

La création d'une seconde classe avec l'implémentation proprement dite et l'exposition de l'API fonctionnelle rend cette opération beaucoup plus propre, mais au prix d'une couche supplémentaire d'indirection. C généralement gère cela en ayant un pointeur vers un objet opaque que la bibliothèque crée et détruit pour vous.