Help for correct class structure

M

me.devilspride

Hi,

I have two classes A and B as follows.
A has member data X and member functions P, Q, R. All P,Q,R access X
and Q calls P.
B is a derived class of another Class(which I don't go into) with
member functions D, E.

P in A calls D in B.
D in B calls Q, R in A.

It's a big recursion. Everything works if I move D,E to class A. But
how do I achieve above as value of X need to be used through the whole
program execution? I wanted to know if what I am trying to accomplish
is something doable or I need to redesign my class structures.

Thanks
 
J

Jim Langston

Hi,

I have two classes A and B as follows.
A has member data X and member functions P, Q, R. All P,Q,R access X
and Q calls P.
B is a derived class of another Class(which I don't go into) with
member functions D, E.

P in A calls D in B.
D in B calls Q, R in A.

It's a big recursion. Everything works if I move D,E to class A. But
how do I achieve above as value of X need to be used through the whole
program execution? I wanted to know if what I am trying to accomplish
is something doable or I need to redesign my class structures.

Thanks

How about showing some actual code? Even something like:

class A
{
int X;
public:
P() {}
Q() {}
// ...
};

etc..

What your'e trying to describe in words is not clear.
 
M

me.devilspride

How about showing some actual code?  Even something like:

class A
{
   int X;
public:
   P() {}
   Q() {}
   // ...

};

etc..

What your'e trying to describe in words is not clear.

I am sorry for that

class A {
int X;
public:
P() { Q(); }
Q() { D(); R(); }
R() { uses X }
};

class B: public someclass {
//inherited data from someclass
public:
D() {
Q(); //end condition for recursion depends on X
R();
}
};

I can't create D() in A as D() access private data in B. But D() calls
both Q() and R() and value of X has to be same everywhere. i.e. R()
called from D access the same X value that was used by class A. I
guess I need to pass around this pointer of A's object or X. I guess
it shouldn't be difficult but I am just blocked.
Hope this helps.
 
J

Jim Langston

I am sorry for that

class A {
int X;
public:
P() { Q(); }
Q() { D(); R(); }
R() { uses X }
};

class B: public someclass {
//inherited data from someclass
public:
D() {
Q(); //end condition for recursion depends on X
R();
}
};

I can't create D() in A as D() access private data in B. But D() calls
both Q() and R() and value of X has to be same everywhere. i.e. R()
called from D access the same X value that was used by class A. I
guess I need to pass around this pointer of A's object or X. I guess
it shouldn't be difficult but I am just blocked.
Hope this helps.

There is no relationship between A and B in your code. A does not create an
instance of B, or B A, A does not derive from B, nor B A. How does Q know
which instance of B to call D for? How does D know which instance of A to
call Q for? You either have to pass a B to A and/or an A to B.
class A {
{
int X;
public:
P(B& b) { Q( b ); }
Q(B& b) { b.D( this ); )
R( ) { uses X )
};

class B: public someclass {
public:
D( A& a ) {
a.Q( this );
a.R();
}
 
M

me.devilspride

There is no relationship between A and B in your code.  A does not create an
instance of B, or B A, A does not derive from B, nor B A.  How does Q know
which instance of B to call D for?  How does D know which instance of A to
call Q for?  You either have to pass a B to A and/or an A to B.
class A {
{
   int X;
public:
   P(B& b) { Q( b ); }
   Q(B& b) { b.D( this ); )
   R( ) { uses X )

};

class B: public someclass {
public:
   D( A& a ) {
      a.Q( this );
      a.R();

}

Thanks for the reply, that actually was my problem. Actually in my
case there will be just one instance of A and B. But there isn't just
one class B, there are lots of classes derived from a parent class. I
am actually creating objects for these classes, kind of linked list. A
has functions for creating a list, but it may be nested that's why
there is a recursion. I guess passing A to B in my case is good. Thank
you.
 
M

me.devilspride

Thanks for the reply, that actually was my problem. Actually in my
case there will be just one instance of A and B. But there isn't just
one class B, there are lots of classes derived from a parent class. I
am actually creating objects for these classes, kind of linked list. A
has functions for creating a list, but it may be nested that's why
there is a recursion. I guess passing A to B in my case is good. Thank
you.

I still have some problems, Here A creates an instance of B and calls
member function of B.

///A.h
class A {
{
int X;
public:
P() { Q(); }
Q() {
R();
bb = new B();
bb.D( this ); )
R() { uses X )

};

///B.h
class B: public someclass {
public:
D( A& a ) {
a.Q();
a.R();
};

But there is a cyclic dependency and forward declaration of A in B
doesn't work. What should I do?
Any help would be very appreciated. Thanks.
 
T

tragomaskhalos

I still have some problems, Here A creates an instance of B and calls
member function of B.

///A.h
class A {
{
   int X;
public:
   P() { Q(); }
   Q() {
      R();
      bb = new B();
      bb.D( this ); )
   R() { uses X )

};

///B.h
class B: public someclass {
public:
   D( A& a ) {
      a.Q();
      a.R();

};

But there is a cyclic dependency and forward declaration of A in B
doesn't work. What should I do?
Any help would be very appreciated. Thanks.- Hide quoted text -

- Show quoted text -

You're thinking in Java/C# terms - separate the interface from
the implementation and all will be well:

// A.h
class A {
int X;
public:
void Q();
void R();
};

///B.h
class B: public someclass {
public:
D( A& a );
};

//A.cpp
#include "A.h"
#include "B.h"
void A::Q() {
R();
bb = new B();
bb.D( this );
}
void A::R() { uses X }

//B.cpp
#include "B.h"
#include "A.h"
void B::D( A& a ) {
a.Q();
a.R();
}
 
M

me.devilspride

You're thinking in Java/C# terms - separate the interface from
the implementation and all will be well:

// A.h
class A {
    int X;
 public:
    void Q();
    void R();

};

///B.h
class B: public someclass {
public:
   D( A& a );

};

//A.cpp
#include "A.h"
#include "B.h"
void A::Q() {
       R();
       bb = new B();
       bb.D( this );}

void A::R() { uses X }

//B.cpp
#include "B.h"
#include "A.h"
void B::D( A& a ) {
      a.Q();
      a.R();

}

OK, but adding header files that way wouldn't cause any problems. I
did the same but got errors like - "C++ forbids declaration with no
type". But I will again try, Thanks.
 
T

tragomaskhalos

OK, but adding header files that way wouldn't cause any problems. I
did the same but got errors like - "C++ forbids declaration with no
type". But I will again try, Thanks.- Hide quoted text -

- Show quoted text -

Sorry, I forgot the required forward declarations
in the B header:

///B.h
class A; // <===== forgot this.
class B: public someclass {
public:
D( A& a );
};
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top