Alxspb
Alxspb

Reputation: 35

C++ nested class instances

What I have is 2 classes:

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);
    }
}

With that logic everything must work fine as expected. But it won't because of loop include: A.h including B.h and B.h including A.h

The question is how to make it working with that structure of code or other.

Main feature that should exist is to call event in A object which is holding B object.

Every help would be appreciated.

Upvotes: 0

Views: 218

Answers (2)

arjen1988
arjen1988

Reputation: 109

Forward declare class A; in B.h and class B; in A.h

You should then move the implementation of onRemove() to B.cpp and include A.h here.

Also don't forget your include guards. Example:

#ifndef _A_H_
#define _A_H_

class B;

class A {

};

#endif

The include guards could also be replaced by #pragma once at the beginning of the header, this is a little less verbose.

Edit

To be complete:

// 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);
}

Well, something like this...

Upvotes: 1

Serge
Serge

Reputation: 12354

the usual way is to provide guarding macros to prevent recursion and move definition of functions in a separate file if needed:

a.h

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

...

c.cpp (if needed)

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

void B::onRemove() {
   blahblahblah
}

Upvotes: 1

Related Questions