Dois-je avoir un .fichier cpp pour une classe abstraite?
D'abord, je suis novice en C++. - Je ouvrir un fichier d'en-tête pour chaque classe C++. Maintenant, je suis dans un besoin de créer une classe abstraite. Voici mon code
De la magie.h
#pragma once
class Magic
{
public:
Magic(void);
~Magic(void);
virtual void display()=0;
};
Magic.cpp
#include "Magic.h"
Magic::Magic(void)
{
}
Magic::~Magic(void)
{
}
Maintenant, comme vous le savez je ne peux pas ajouter la suite pour le fichier cpp.
Magic::display()
{
}
Donc, ai-je vraiment besoin d'un .fichier cpp pour une classe Abstraite? Ou bien, suis-je tort d'appeler display()
dans .fichier cpp?
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas besoin un fichier d'implémentation. Il suffit de définir tous les membres en ligne (et ne définissent pas le pur virtuel si vous n'avez pas besoin d').
#include "Magic.h"
quelque part.Si vous êtes à la suite de la
2-files-per-class
etone-class-in-each-set-of-files
conventions, il serait mieux d'avoir un.cpp
fichier même si vous écrivez une classe abstraite.Il ya quelques autres avantages en plus de la maintenance de la cohérence: avoir un
.cpp
ou la mise en œuvre de fichier vous donne la possibilité d'étendre à l'avenir, si vous ajoutez un non-virtuel communes de comportement de votre famille, de classes, de la classe de base est le bon endroit pour l'ajouter. Également des modifications mineures dans le.cpp
fichier résultat en beaucoup moins de temps pour la compilation de ceux-ci dans une.h
qui sont inclus à partir de plusieurs endroits.Conventions de côté, vous pouvez très bien placer une classe (abstraite ou non) dans un seul et unique
.h
fichier. Des bibliothèques comme la STL faire cela tout le temps.Vous n'avez pas besoin d'un fichier source pour les classes abstraites (j'.e de l'interface).
En outre, si vous avez une méthode virtuelle de tout type, vous devez ajouter un virtuel destructeur aussi bien (ou faire le destructeur protégé).
Aussi, vous pouvez simplement laisser le compilateur de générer un constructeur par défaut pour vous. Si vous voulez une fonction virtuelle pure (que la classe dérivée DOIT remplacer)
vous ne devez pas ajouter de corps de la fonction, afin de laisser le
void Magic::display() {}
loin. Et puisque vous avez à fournir un corps pour le destructeur, vous pouvez le définir en ligne:ou encore plus simple:
Pas, vous pouvez ajouter une fonction
definition
pour fonction virtuelle pure, mais normalement, vous n'avez pas besoin de fournir de définition de fonction pour fonction virtuelle pure. Remarque, il vous manque la fonction de type de retour pourMagic::display()
, devrait être:Si votre classe ne contient que des virtuel méthodes, il définit en fait une interface. Une interface, par nature, est un contrat entre 2 entités, sans mise en œuvre de la dépendance. Par conséquent, comme une bonne pratique de conception, non seulement vous n'avez pas besoin de la
.cpp
fichier, c'est mieux sans elle.Puisque vous êtes à l'aide de VS, vous pouvez également utiliser MS extension __interface pour les interfaces au lieu de classes avec des méthodes virtuelles pures (attention, il n'est pas portable).