C++ Appeler une fonction d'une autre classe
Très novice en c++ de la difficulté à l'appel d'une fonction à partir d'une autre classe.
Classe B inherites de la Classe A , et j'ai envie de catégorie A à être en mesure d'appeler une fonction créée dans la classe B.
using namespace std;
class B;
class A
{
public:
void CallFunction ()
{
B b;
b.bFunction();
}
};
class B: public A
{
public:
virtual void bFunction()
{
//stuff done here
}
};
Il semble tout à fait correcte à l'écran (pas d'erreurs évidentes), mais lorsque j'essaie de compiler, je reçois une erreur C2079 'b' utilise pas défini de classe B.
J'ai essayé de faire d'eux des pointeurs/friends
mais j'obtiens le même message d'erreur,
- pouvez-vous montrer le code complet?
- ne fonctionne pas, il hérite de la classe A... Il doit partager son interface et de sa mise en œuvre, respectivement, dans .h et .fichiers cpp. Et
#include "B.h"
dansA.cpp
- Ressemble à une dépendance cyclique. Classe
B
nécessite des fonctionnalités de classeA
depuis il hériteA
. Toutefois, la catégorieA
nécessite des fonctionnalités de classeB
afin d'utiliser correctement leCallFunction
méthode. L'une de ces classes doivent être définies au préalable.
Vous devez vous connecter pour publier un commentaire.
Ce qui se passe pour la même raison que les fonctions de C ne peut pas s'appeler les uns les autres sans au moins l'un d'entre eux d'être déclaré comme un prototype de fonction.
Pour résoudre ce problème, nous devons nous assurer que les deux classes sont déclarées avant leur utilisation. Nous avons séparé la déclaration de la définition. Cet article MSDN explique plus en détail sur les déclarations et les définitions.
Ce que vous devez faire, est de mettre
CallFunction
en *.fichier cpp, où vous incluez B. h.Après editer les fichiers de ressembler à:
B. h:
B.cpp
Référencement de votre explication, que vous avez essayé de changer B b; dans pointeur - il serait bon, si vous ne l'utilisez pas au même endroit. Vous pouvez utiliser le pointeur de indéfinie de la classe(mais déclarée), parce que TOUS les pointeurs ont fixé la taille en octets(4), de sorte que le compilateur n'a pas de problèmes avec ça. Mais il ne sait rien à propos de l'objet qu'ils désignent(tout simplement: connaît la taille/de limites, pas le contenu).
Tant et aussi longtemps que vous êtes à l'aide de la connaissance, que tous les pointeurs sont de même taille, vous pouvez les utiliser n'importe où. Mais si vous voulez utiliser l'objet, ils se dirigent à, la classe de cet objet doit être déjà définis et connus par le compilateur.
Et dernière précision: les objets peuvent varier en taille, contrairement aux pointeurs. Pointeur est un nombre, un index, ce qui indique l'endroit dans la mémoire RAM, où quelque chose est stocké(par exemple index: 0xf6a7b1).
dans Un vous avez utilisé une définition de B qui n'est pas donné jusqu'alors , c'est pourquoi le compilateur est de donner à l'erreur .
Déclarer avant
class B
et de swap afin deA
etB
définitions: 1erB
et 2èmeA
. Vous ne pouvez pas appeler les méthodes de l'avant a déclaréB
classe.de la classe B est à seulement déclaré mais pas défini au début, qui est ce que le compilateur se plaint. La cause est que dans la catégorie A de la Fonction d'Appel, vous faites référence à l'instance b de type
B
, qui est incomplète et indéfini. Vous pouvez modifier la source comme cela, sans introduire de nouveau fichier(par souci de simplicité, n'est pas recommandé dans la pratique):