11
votes

Est-il possible de définir plusieurs classes dans un seul fichier .cpp?

Je travaille sur un projet pour l'école et l'instructeur insiste sur le fait que tous les codes vont dans un fichier .CPP (pour faciliter la classement de sa part). Je voudrais définir plusieurs classes dans ce fichier. Est-ce que je rencontrerai des problèmes pour ce faire?


4 commentaires

Vous pouvez mettre vos cours dans les en-têtes que vous souhaitez, puis exécutez GCC -E et envoyez l'instructeur la sortie. Ne faites pas vraiment cela, parce que (a) votre instructeur refusera de le lire, et (b) tous les insertions des en-têtes standard déclencheront des alertes de plagiat. Mais si vous regardez une fois sur cette sortie et notez qu'il est compilable, vous verrez que vous pouvez faire tout ce que vous aimez dans un fichier de RPC que vous pouvez faire dans les en-têtes.


Si votre instructeur a demandé de soumettre un fichier unique, il n'est-il pas raisonnable de supposer que votre langage de programmation permet une telle chose? Quelle raison avez-vous dû douter de votre instructeur sur cette question particulière?


@ROB: Bon point donné que nous connaissons la réponse, mais considérons que les instructeurs imposent fréquemment des conditions telles que: "Sans utiliser des appels récursifs, seules des boucles"; "Seulement en utilisant des appels récursifs, pas de boucles"; et en général "suspendu à l'envers avec une main attachée derrière le dos". Sans aucun doute pour des raisons d'enseignement saines, mais cela signifie que votre hypothèse n'est pas toujours correcte ni raisonnable ;-)


@Rob, peut-être que l'instructeur n'a jamais pensé qu'ils utiliseraient plus d'une classe?


11 Réponses :


31
votes

Il n'y a pas de règle que vous devez suivre (comme en Java). Vous êtes libre de placer et de nommer des classes dans les fichiers nommés que vous aimez (en plus du suffixe).

Cependant, sa question une autre question si c'est de bonnes pratiques (ce n'est pas!).


1 commentaires

Pour ajouter à cela, n'oubliez pas que vous devez mettre les cours que vous allez utiliser avant votre classe principale ou que le compilateur ne les trouvera pas. (sauf si vous utilisez la déclaration avant)



6
votes

Il n'y a aucun problème à écrire plusieurs classes dans un seul fichier. Il s'agit que d'un style de maintenance.


0 commentaires

3
votes

juste des problèmes d'évolutivité / de maintenabilité;) Il n'y a pas de règles strictes à ce sujet.


1 commentaires

Si ce projet d'école souffre de problèmes d'évolutivité, Tchad doit négocier un salaire pour son travail ;-)



12
votes

Oui, vous pouvez. Ceci est facilement vérifiable.

class C
{
};

class D
{
};

int main(int argc, char**argv)
{
  return 0;
}


1 commentaires

Bien que la responsabilité habituelle C ++ applique: "Juste parce que votre compilateur l'accepte que cela ne signifie pas qu'il est autorisé en fonction de la norme C ++" (bien que dans ce cas, il est bien sûr parfaitement valide)



3
votes

non. Vous ne rencontrerez pas de problèmes. En C ++, vous pouvez définir plusieurs classes à l'intérieur d'un seul fichier.


0 commentaires

7
votes

Vous pouvez parfaitement avoir plusieurs classes déclarées et définies dans le même fichier.

Vous devez faire attention, quand une classe dépend d'un autre qui vient plus tard. Si une classe A doit être membre d'une autre classe B, le compilateur a besoin de sa déclaration complète (afin qu'elle connaisse sa taille) et vous devez le mettre plus haut dans le fichier. Si ce membre est juste un pointeur, cependant (qui a une taille indépendante de la taille de la classe pointée), une simple déclaration en avant de la classe pointue à la classe est suffisante.

Notez que avec le mécanisme #include , c'est à peu près ce qui se passe quand même: le prétraiteur "Copier-coller" tous les fichiers inclus dans le fichier étant compilé. Au compilateur, c'est la même chose.


0 commentaires

3
votes

Vous n'aurez aucun problème pour définir plusieurs classes dans un seul fichier.

Ce n'est pas particulièrement une bonne pratique pour les systèmes de production, mais ce n'est pas un problème pour les devoirs


0 commentaires

3
votes

Oui, vous pouvez. Cela doit être pris en charge car sinon, vous ne seriez pas en mesure de créer des classes imbriquées.

class outside
{
public:
      class nested
      {
      public:
            static int x;
            static int y;
            int f();
            int g();
      };
};


0 commentaires

5
votes

Typiquement, vous ne devez placer que plusieurs classes dans un seul fichier si ...

  1. Les classes sont très étroitement liées. Par exemple, si une classe définit son propre itérateur, il pourrait être approprié de mettre cette classe Itératrice dans le même dossier que la classe qu'il est utilisée pour itérer.

  2. L'une des classes est destinée à la consommation publique et les classes restantes sont utilisées pour la mettre en œuvre. E.G., cela s'appliquera si vous utilisez l'idiome "Pimpl", où le seul membre que la classe publique contient est un pointeur de la classe privée. Dans ce cas, il peut être approprié de mettre les classes privées / cachées dans le fichier source correspondant à la classe publique qui les utilise.

    Dans les deux cas, la décision de mettre le "assistant public" (par exemple, itérateur) et "helper privé" (par exemple, pimpl) les classes dans le même fichier source ou un fichier source différent doit être effectuée une fois pour un projet entier et suivit systématiquement.


1 commentaires

J'aime votre réponse en expliquant certaines utilisations où elle est de manière inquiète la bonne chose à faire. L'exemple d'itérateur Je suis certainement d'accord avec. La raison pour laquelle j'ai regardé cela était parce que je fais une boîte de dialogue d'onglets QT pour mes préférences d'application et j'ai besoin d'une classe pour la fenêtre et les classes pour les onglets. Je débatte de débattre de Wether pour diviser les onglets en fichiers mais je n'ai pas vraiment de place dans ma structure de fichiers pour cela.



2
votes

La question provient de la représentation de la source de style Java / C #. En C ++, la disposition du code source est très différente. Une unité source / "fichier cpp" / pourrait gérer autant de déclarations que vous souhaitez mettre. Cependant, ce n'est pas nécessaire une bonne stratégie depuis à un moment donné, vous devez dire à d'autres classes comment gérer vos cours. En C ++, une classe peut avoir une section de définition et de déclaration séparée et vous pouvez les placer dans différents fichiers. La définition de la classe est partagée entre d'autres fichiers source avec des instructions #include afin que vous puissiez utiliser ces classes dans n'importe quel scénario où la définition est nécessaire. Si vous traitez de classes utilisées uniquement dans un fichier source, vous pouvez la masquer directement dans les fichiers source, mais si vous souhaitez les connecter à d'autres classes, vous devez définir la définition dans un fichier d'en-tête.

Cela pourrait vous aider à améliorer la vitesse de compilation - surtout si vous utilisez des en-têtes pré-compilés, mais CARESULLY, car PCH-S ne fait pas partie de la norme C ++ et chaque compilateur les traite d'une manière différente! - et la flexibilité de votre code. Votre professeur devrait être au courant de ces faits ...


0 commentaires

2
votes

Oui, vous pourriez le faire sans problème. soit une classe multiple ou une classe imbriquée.


0 commentaires