2009-11-06 10 views
0

im luttant avec la syntaxe ici: j'espère que cette question est v simple, im juste miising le point.une très simple C++ oop question

spécifiquement, si je imbriquer une classe dans une autre classe, donc par exemple

class a 
{ 
    a //the constructor 
    { 
     b an_instance_of_b // an instance of class b 
    } 
}; 

class b 
{ 
    public: 
    foo() 
    { 
     cout << "foo"; 
    } 
}; 

Quand je tente d'accéder à cette méthode dans B en faisant ceci:

a an_instance_of_a; //declare an instance of a 
an_instance_of_a.an_instance_of_b.foo() 

^^ ceci ne semble travailler. Ceci est simplifié (donc peut-être une faute de frappe ici quelque part). mais je sais que les classes sont bien configurées, c'est juste que je ne peux pas accéder aux méthodes à l'intérieur si elles sont imbriquées. Que puis-je faire de mal?

merci beaucoup.

Répondre

3

Votre an_instance_of_b n'est pas membre d'une, mais une variable locale dans le constructeur de a (et la déclaration du constructeur ne contient pas la parenthèse).

Ce qui se passera ici est que lorsque vous créez une instance de a, il crée et détruit immédiatement une instance de b, puis il quitte le constructeur pour a et l'instance est créée.

+0

qui était en effet le problème! J'ai essayé quelques solutions, mais à la fin (poster ici pour la postérité): la méthode la plus simple était de créer un pointeur vers la classe b dans la classe a, puis d'appeler cela depuis la fonction principale (en utilisant l'opérateur -> le cas échéant) – ohnoitslateandiwanttosleep

0

Je ne vois pas de classe imbriquée dans une autre classe.

Je vois la classe "a" se terminer par un point-virgule, avant que la classe "b" ne commence. Par conséquent, pas d'imbrication.

EDIT

J'ai reformaté votre code pour préciser où les cours commencent/fin.

Il vous manque un point-virgule après b an_instance_of_b

Le constructeur de a est privé par défaut. Je pense que vous voulez un constructeur public.

EDIT 2

Je pense que cela est le code que vous voulez:

class b; // forward declare "b" so that it is valid in class "a" 

class a 
{ 
    public: 
    a(void) //Constructor is now public. 
    { 
     // Empty body. There is now a member variable 
    } 

    public: 
     b a_member_instance_of_b; 
}; 

class b 
{ 
    // Note: no constructor. 
    public: 
    foo() 
    { 
     cout << "foo"; 
    } 
}; 

int main(void) 
{ 
    a an_instance_of_a; 
    an_instance_of_a.a_member_instance_of_b.foo(); 
    return 0; 
} 
+0

lol. Je devrais aller dormir! J'ai changé d'avis au milieu des noms. ça devrait être a et b. excuses. Je suis tout à fait pathétique – ohnoitslateandiwanttosleep

1

Essayez ceci:

class B; // prototype declaration 

class hello { 
    hello() { //the constructor 
     B an_instance_of_b; // an instance of class b 
    } 
}; 

class B { 
public: 
    void foo() { 
     cout << "foo"; 
    } 
}; 

D'abord, ils ne sont pas imbriqués dans votre exemple. Il n'y a pas non plus besoin de le faire, de toute façon. Deuxièmement, il y avait quelques erreurs de déclaration de fonction et de données.

Enfin, vous avez besoin d'un prototype de B afin que la déclaration hello::an_instance_of_b puisse fonctionner comme référence vers l'avant. Ou, il suffit de déclarer B avant hello.

1

Cela fonctionne pour moi avec g ++ sous Linux:

#include <iostream> 

using namespace std; 

class B { 
public: 
     void foo() { 
       cout << "foo" << endl; 
     } 
}; 

class A { 
public: 
     B b; 
}; 

int main() { 
     A a; 
     a.b.foo(); 
} 

Je pense b pourrait bien être privé dans votre cas.

1

Essayez de poster le code exact qui compile les exécutions &. Vous pouvez supprimer les fonctions inutiles, mais le code ci-dessus ne sera même pas compilé, il est donc très difficile de résoudre le problème.

Cependant, si vous le saisissez, an_instance_of_b est protégé par défaut, n'est-ce pas? Ce qui signifie que vous ne pourrez pas y accéder en dehors de la classe. De plus, à en juger par votre code posté, an_instance_of_b n'est même pas une variable de classe, c'est une variable locale dans le constructeur. Vous devrez ajouter un Getter pour récupérer l'instance. Peut-être quelque chose comme ça (je n'ai pas fait C++ depuis un certain temps si):

class ClassA 
{ 
    public: 
    hello() { _ClassB = new ClassB(); } 
    ClassB GetClassB() { return _ClassB; } 
    private: 
    ClassB _ClassB; 
} 

class ClassB 
{ 
    public: 
    foo() {} 
} 

void SomeRandomFunction() 
{ 
    ClassA classA = new ClassA(); 
    classA.GetClassB().foo(); 
}