2017-07-18 1 views
0

Ce que j'est 2 classes:C++ instances de classes imbriquées

A.h:

#include "B.h" 
class A 
{ 
    vector<B*> arr; 
    void Update(int32 id){...}; 
} 

B.h

#include "A.h" 
class B 
{ 
    int32 id; 
    A* parent; 
    void OnRemove() 
    { 
     ... 
     parent->Update(id); 
    } 
} 

Avec que tout logique doit fonctionner correctement comme prévu. Mais il ne sera pas à cause de loop include: A.h y compris B.h et B.h y compris A.h

La question est de savoir comment faire fonctionner avec cette structure de code ou autre.

La caractéristique principale qui devrait exister est d'appeler un événement dans un objet qui contient un objet B.

Toute aide serait appréciée.

+2

pas 100% sûr mais il semble que cela est dupe de: https://stackoverflow.com/questions/625799/resolve-header-include-circular-dependencies – NathanOliver

Répondre

1

Avancer déclarer class A; dans B.h et class B; dans A.h

Vous devez ensuite déplacer la mise en œuvre de onRemove() à B.cpp et comprennent A.h ici.

N'oubliez pas vos protections incluses. Exemple:

#ifndef _A_H_ 
#define _A_H_ 

class B; 

class A { 

}; 

#endif 

Les gardes comprennent pourrait aussi être remplacé par #pragma once au début de l'en-tête, c'est un peu moins bavard.

Modifier

Pour être complet:

// A.h 

#pragma once 

#include <vector> 

class B; 
class A { 
    std::vector<B*> arr; 

public: 
    void Update(int32 id);   
}; 

// A.cpp 

#include "A.h" 

// possibly #include "B.h" if necessary 

void A::Update(int32 id) { 
    // impl ... 
} 

// B.h 

#pragma once 

class A; 
class B 
{ 
    int32 id; 
    A* parent; 

public: 
    void OnRemove(); 
}; 

// B.cpp 

#include "B.h" 
#include "A.h" 

void B::OnRemove() { 
    parent->Update(id); 
} 

Eh bien, quelque chose comme ça ...

+0

Merci pour votre réponse complète. – Alxspb

1

la manière habituelle est de fournir la garde des macros pour empêcher récursivité et déplacer la définition des fonctions dans un fichier séparé si nécessaire:

ah

#ifndef _A_H_ 
#define _A_H_ 
#include "B.h" 
class A 
{ 
    vector<B*> arr; 
    void Update(int32 id){...}; 
} 
#endif 

...

c.cpp (si nécessaire)

#include <a.h> 
#include <b.h> 

void B::onRemove() { 
    blahblahblah 
} 
+0

L'utilisation de 'guarding macros' est donc identique à l'utilisation de' pragma once'? – Alxspb

+0

Dois-je utiliser la déclaration forward dans B.h pour faire que 'A * parent' compile? – Alxspb

+0

Les noms qui commencent par un trait de soulignement suivis d'une lettre majuscule ('_A_H_') et les noms qui contiennent deux traits de soulignement consécutifs sont réservés à l'implémentation. Ne les utilisez pas dans votre code. –