How do I implement mutually recursive classes in C++? Something like:
/*
* Recursion.h
*
*/
#ifndef RECURSION_H_
#define RECURSION_H_
class Class1
{
Class2* Class2_ptr;
public:
void Class1_method()
{
//...
(*Class2_ptr).Class2_method();
//...
}
};
class Class2
{
Class1* Class1_ptr;
public:
void Class2_method()
{
//...
(*Class1_ptr).Class1_method();
//...
};
};
#endif /* RECURSION_H_ */
From Wikipedia, the free encyclopedia In mathematics and computer science, mutual recursion is a form of recursion where two mathematical or computational objects, such as functions or datatypes, are defined in terms of each other.
If you have two mutually-recursive functions that both alter the state of an object, try to move almost all the functionality into just one of the functions. Otherwise you will probably end up duplicating code. Mutual recursion is also known as indirect recursion, by contrast with direct recursion, where a single function calls itself directly.
Once you have mutually recursive modules in a package, you will no longer be able to put modules of an import cycle into different packages, because mutually recursive packages are not supported. The Haskell 98 report says, that Haskell 98 allows mutually recursive modules, but not all compilers support them completely or even in a simple way.
Just as algorithms on recursive data types can naturally be given by recursive functions, algorithms on mutually recursive data structures can be naturally given by mutually recursive functions. Common examples include algorithms on trees, and recursive descent parsers.
class Class1;
class Class2;
class Class1
{
Class2* Class2_ptr;
public:
void Class1_method();
};
class Class2
{
Class1* Class1_ptr;
public:
void Class2_method();
};
void Class1::Class1_method()
{
//...
(*Class2_ptr).Class2_method();
//...
}
void Class2::Class2_method()
{
//...
(*Class1_ptr).Class1_method();
//...
}
Use forward declaration.
class Class2;
class Class1
{
Class2* Class2_ptr;
};
class Class2
{
Class1* Class1_ptr;
}
Because the methods in Class1 will depend on the actual definition of Class2, method definitions must occur after the Class2 declaration, since you can't use methods from only a forward declaration.
On the other hand, this kind of tight coupling is usually indicative of bad design.
Predeclare one of the classes, for example Class2
#ifndef RECURSION_H_
#define RECURSION_H_
class Class2;
class Class1
{
Class2* Class2_ptr;
public:
void Class1_method()
{
//...
(*Class2_ptr).Class2_method();
//...
}
};
class Class2
{
// ...
}
Forward declare one of the classes (or both) on the top, eg.:
class Class2;
class Class1 { ... };
and define the methods after both of the classes are defined (that is, out-of-line):
class Class1
{
...
void Class1_method(); // just declare
...
};
class Class2
{
...
};
// once definition of Class2 is known, we can define the method of Class1
void Class1::Class1_method()
{
//...
(*Class2_ptr).Class2_method();
//...
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With