Comment accéder à des variables dans une classe différente de l'autre classe?
Laissez juste dire que nous avons deux classes, A
et B
.
Voici le code pour les deux
class A
{
public:
int x;
};
class B
{
public:
int y;
void FindY() { y = x + 12; }
};
void something()
{
A fs;
B fd;
fs.x = 10;
fd.FindY();
}
le problème est que je veux accéder à x, mais je ne veux pas passer n'importe quoi comme argument de ma fonction je regarde l'ami et l'héritage, mais les deux ne semblent pas à m'aider, à me corriger si je me trompe.
certains comment j'ai besoin de trouver x en fonction FindY()
.
Je vais avec la méthode statique, mais dans mon cas, j'obtiens cette erreur.
Erreur 2 erreur LNK2001: symbole externe non résolu "public: static de la classe std::vector<class GUIDialog *,class std::allocator<class GUIDialog *> > Window::SubMenu" (?SubMenu@Window@@2V?$vector@PAVGUIDialog@@V?$allocator@PAVGUIDialog@@@std@@@std@@A) C:\Users\Owner\documents\visual studio 2010\Projects\Monopoly\Monopoly\Window.obj
Voici comment je l'ai déclaré
static vector<GUIDialog *> SubMenu;
Je reçois cette erreur à cause de cette ligne
SubMenu.resize(3);
x
n'existe pas sans une instance deA
. Vous avez besoin pour obtenir à partir de quelque part.- Vous devez créer un objet de la classe
A
et ensuite utiliserA.x
. Est que le wat vous demandez ou ai-je raté quelque chose? - j'ai mis à jour mon post
- Pourquoi vous ne voulez pas passer le paramètre à la fonction? Je crois que c'est la question fondamentale qui doit être résolu, plutôt que de l'accès
fs.x
. - Ok n'est pas seulement un fs je vais passer ok?
- en utilisant une variable statique serait plus facile pour moi
Vous devez vous connecter pour publier un commentaire.
Trois approches différentes:
B::FindY prendre Un objet en tant que paramètre
Faire Un::x statique
B hérite de A.
CashCow souligne aussi plus de moyens pour le faire, dans sa réponse.
Error 2 error LNK2001: unresolved external symbol "public: static class std::vector<class GUIDialog *,class std::allocator<class GUIDialog *> > Window::SubMenu" (?SubMenu@Window@@2V?$vector@PAVGUIDialog@@V?$allocator@PAVGUIDialog@@@std@@@std@@A) C:\Users\Owner\documents\visual studio 2010\Projects\Monopoly\Monopoly\Window.obj
j'ai mis à jour mon post pour plus d'infosComme il est,
x
n'est pas une variable de la classeA
mais une variable d'objets ("cas") de la catégorieA
. Il y a au moins deux façons de fairex
accessible à partir deB::findY
sans passer quelque chose à la fonction:A
à l'intérieur de laB::findY
fonction:x
une variable statique, de sorte qu'il s'agit d'une variable sur la classe elle-même. Vous n'avez pas besoin d'instancier des objets dans ce cas, mais la variable seront communes à tous les objets de typeA
(donc vous ne pouvez pas avoir des valeurs différentes dex
pour les différents objets):En supposant que A est correct et vous ne pouvez pas le changer, c'est à dire x est une variable de membre, vous aurez besoin d'une instance de l'Une afin d'utiliser ses x membre.
Donc dit que nous pouvons modifier B, mais vous avez besoin FindY() de ne pas prendre de paramètres.
Par conséquent, nous devons apporter dans l'Une avec un appel antérieur et le stocker en tant que membre de la classe.
C'est juste un aperçu. C'est ce qui est généralement fait pour "foncteur" classes où la fonction est l'opérateur() et prend un nombre fixe de paramètres attendus, mais nous voulons plus. L'ensemble de boost::bind est basée sur ce principe.