Question

Je me demande s'il est possible d'ajouter des méthodes dans le programme principal à une classe existante définie dans le fichier d'en-tête. Par exemple: class CFun Il y a CFun.hpp défini dans le fichier party.cpp, mais dans notre void hello() {cout << "hello" << endl;}; nous voulons ajouter une méthode Multiple declaration for 'CFun' sans édition <=>

Évidemment (malheureusement) la construction:

#include "CFun.hpp"

class CFun
{
  public:
    void hello() {cout << "hello" << endl;};
};

ne fonctionne pas en renvoyant une erreur <=>

Est-il possible de le faire fonctionner sans héritage de classe?

Était-ce utile?

La solution

Non, mais vous pouvez ajouter une méthode prenant une référence / un pointeur vers une classe CFun. Vous n'aurez tout simplement pas accès aux données privées:

void Hello(CFun &fun)
{
    cout << "hello" << endl;
}

C’est probablement le mieux que vous puissiez faire. Comme l'a souligné litb, cette fonction doit être dans le même espace de noms que CFun. Heureusement, les espaces de noms, contrairement aux classes, peuvent être ajoutés à plusieurs endroits.

Autres conseils

Vous pouvez redéfinir la classe comme suit:

#define CFun CLessFun
#include "CFun.hpp"
#undef CFun

class CFun : CLessFun
{
   public:
    void hello() {cout << "hello" << endl;};
};

Mettez ceci dans un nouveau fichier d'en-tête CMoreFun.hpp et incluez-le à la place de CFun.hpp

Non, ce n'est pas possible. Il ne peut y avoir qu'une seule définition d'une classe particulière, et il doit s'agir d'une définition complète, ce qui signifie que vous ne pouvez pas avoir de définitions partielles à différents endroits, ce qui ajoute des membres à la classe.

Si vous devez ajouter une fonction membre à une classe, vous devez soit modifier la définition de la classe (modifier CFun.hpp), soit dériver une nouvelle classe de CFun et y mettre hello().

L'analogue le plus proche de ce type de construction (ajout de fonctionnalités à des classes prédéfinies) en C ++ est le modèle Decorator. Ce n'est pas exactement ce que vous recherchez, mais cela peut vous permettre de faire ce dont vous avez besoin.

Cela semble être un cas d'utilisation évident pour l'héritage. Définir une nouvelle classe:

#include "CFun.hpp"

class CFun2 : public CFun
{
  public:
    void hello() {cout << "hello" << endl;};
};

Utilisez ensuite CFun2 au lieu de CFun dans votre code source.

Après y avoir réfléchi, vous pourriez faire quelque chose de terrible: trouver une fonction dans CFun qui a un type de retour que vous voulez et qui n’est mentionnée qu’une seule fois dans l’en-tête complet. Disons void GoodBye().

Créez maintenant un fichier CFunWrapper.hpp avec ce contenu:

#define GoodBye() Hello() { cout << "hello" << endl; } void GoodBye()
#include "CFun.hpp"
#undef GoodBye

N'incluez que CFunWrapper.hpp au lieu de CFun.hpp.

Mais ne faites pas ceci, à moins qu'il y ait une très bonne raison de le faire. Il est extrêmement sujet aux ruptures et peut même ne pas être possible, selon le contenu de CFun.hpp.

Pas à ma connaissance. Bien que vous puissiez faire une sorte de truquage de jury et faire une solution namespace-y.

class Party : class CFun

(votre party.cpp)

hérite des éléments CFun, y compris de la fonction hello ().

Alors ...

Party p;
p.hello();

Non?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top