Archived

This topic is now archived and is closed to further replies.

Include loops

This topic is 5873 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I am writing an upgradable encapsulation of everything. Don''t ask why. I guess I am a bit obsessive, or maybe I have a complex. Who knows? Well, anyway, I have one class called clsUniverse in clsUniverse.h and .cpp. Another class called clsObject is in clsObject.h and .cpp. clsObject can be stripped down to this: class clsObject { public: friend clsUniverse; //I hope this is legal - tell me private: bool exists; clsUniverse* the_universe; //the one that it "exists" in } clsUniverse can be stripped down to this: class clsUniverse { public: void Create (clsObject& an_object); // an_object.the_universe = this; } the clsObject.h file needs to include clsUniverse.h, but clsUniverse.h needs to include clsObject.h. That would mean they would keep including each other infinitely. How do I overcome this problem? I could do something like this: clsUniverse.h- #include "clsObject.h" clsObject.h- #ifndef _CLSUNIVERSE_H_ #include "clsUniverse.h" #endif Is there any other solution?

Share this post


Link to post
Share on other sites
#pragma once

Although the method of defining a variable to mark inclusion of the header file is the most common (and compiler independent).

BTW a small aside if you are using the #define method, don''t put any underscore at the front of the symbol you''re using. Symbols which begin with underscores followed by a capital letter are reserved by both the C and C++ standards for compiler and SDK use. If you use names with underscores, don''t complain if you ever get a namespace conflict.

--
Simon O''''Connor
Creative Asylum Ltd
www.creative-asylum.com

Share this post


Link to post
Share on other sites
Forward declarations.

In clsObject.h (btw are you a VB programmer?):
class clsUniverse; // this is a forward declaration

class clsObject
{
...
};

And then in clsUniverse.h:
class clsObject;
class clsUniverse
{
...
};

The downside to forward declarations is that you cannot reference any properties (data members) or operations (methods) of the class. The name is essnetially declareed as a placeholder.

Share this post


Link to post
Share on other sites
So long as it is only a complex, you are doing fine. The day it becomes a quaternion, seek medical advice.

Each of your header file should be structured that way :

  
#ifndef HEADER_FILE_H
#define HEADER_FILE_H

.
.
.

#endif /* HEADER_FILE_H */


Since your whole header file is bracketed by the #ifndef/#endif statements, any #include statement beyond the first will only add whitespaces to the file being processed.

Or, as Oluseyi said, if you only need to declare pointers/references/arguments, you can use a forward declaration.

The problem with #pragma is that they are compiler-specific.

Share this post


Link to post
Share on other sites