1

J'ai une classe A, et deux classes, B et C, héritant de A.Solution de contournement pour ifdef/ifndef

Outre les méthodes de A, chaque classe est d'offrir des choses différentes, et, par conséquent, je voudrais les mettre dans deux fichiers différents - b.hpp et c.hpp, car ils sont des modèles avec des fonctions en ligne. J'ai aussi une classe User, en utilisant à la fois B et C classes. En user.cpp, je devrais avoir quelque chose près de:

# include "b.hpp" 
# include "c.hpp" 

class User{ 
    ...; 
}; 

Ce qui soulèverait une erreur de redéfinition du compilateur, pour ce que je garde les deux classes B et C dans un bc.hpp.

La préoccupation ici est plutôt autre esthétique qu'une erreur de programmation: Je ne trouve pas seulement très élégant en utilisant ifdef/ifndef directives dans de petites applications - ils cherchent toujours à moi comme la solution de l'EDI pour les gérer trop de modules, et pour ceux qui ne sont même pas au courant des directives.

Y at-il (même non standard, mais au moins sain d'esprit) solution de contournement pour cela, ou dois-je rester avec soit avoir deux classes différentes dans le même fichier et en utilisant ifdef/ifndef?

Répondre

1

ifndef sont de bonnes pratiques. Ils vous aident à faire de vos fichiers en-tête autonome.

Vous ne voulez pas un fichier A pour arrêter la compilation parce que vous avez retiré une déclaration includeC quelque part dans un autre fichier B. Donc, d'ailleurs, vous incluez C à la fois A et B. Peut-être A comprend B, mais ce n'est pas grave. Sinon, vous devrez ajouter un include C dans B chaque fois que vous supprimez include C de A.

Donc, ifndef sont de bonnes pratiques et devraient être utilisées. En fonction de votre compilateur, vous pouvez avoir des raccourcis syntaxiques tels que pragma once (trouver une discussion here) - mais gardez à l'esprit que ce n'est pas standard même s'il est supporté par la plupart des compilateurs. Btw, code de production professionnelle utilise ifndef gardes.

+0

Je suis d'accord qu'ils sont utilisés par des gens très professionnels - J'ai vu le code du noyau en parlant 'ifndef' une fois que je devais l'ouvrir ^^ C'est juste que je suis habitué à éviter de l'utiliser pour des applications trop petites, comme celle que je suis en train de développer Devinez je vais devoir accepter les faits, de toute façon (: Merci à tous pour les réponses! – Rubens

+1

@Rubens Pour l'instant, les gardes d'en-tête sont la façon dont C++ atteint ce type de modularité: – Potatoswatter

+0

Ma façon de faire est: garder les en-têtes inclus aussi bas que possible pour améliorer le temps de compilation, mais toujours mettre des gardes de sécurité pour ne pas se soucier des doubles imbriqués – Mic

2

Si vous voulez dire dans le fichier d'en-tête, non, il n'y a pas une bonne manière portable de le faire. Il est standard de garder tous vos fichiers d'en-tête dans le format -

#ifndef MYHEADER_HPP 
#define MYHEADER_HPP 

// ... content 

#endif 

Toute autre façon serait pas non standard et réelle C++.

+0

L'OP a explicitement déclaré qu'il était ouvert aux solutions «non standard». – congusbongus

+0

@CongXu Désolé, je l'ai ajouté plus tard, compte tenu de la réponse de pyrospade.Je suis toujours impatient de voir s'il y a une autre solution pour cela (: – Rubens

Questions connexes