C ++ zyklische Aufnahme issue [Duplikat]
-
11-10-2019 - |
Frage
Diese Frage bereits eine Antwort hier:
Ich habe diese Datei logger.hpp:
#ifndef _LOGGER_HPP_
#define _LOGGER_HPP_
#include "event.hpp"
// Class definitions
class Logger {
public:
/*!
* Constructor
*/
Logger();
/*!
* Destructor
*/
~Logger();
/*!
* My operator
*/
Logger& operator<<(const Event& e);
private:
...
};
#endif
Und diese Datei event.hpp
#ifndef _EVENT_HPP_
#define _EVENT_HPP_
#include <string>
#include "logger.hpp"
// Class definitions
class Event {
public:
/*!
* Constructor
*/
Event();
/*!
* Destructor
*/
~Event();
/* Friendship */
friend Logger& Logger::operator<<(const Event& e);
};
#endif
Well. In logger.hpp I umfassen event.hpp und in event.hpp I umfassen logger.hpp.
-
Ich brauche event.hpp enthalten, weil in logger.hpp ich den Bediener definieren müssen.
-
Ich brauche logger.hpp enthalten, weil in event.hpp, der Freundschaft in der Klasse Ereignisse definiert werden.
Nun, das ist natürlich ein zyklische Rekursion .
Ich habe versucht, diese:
1) In logger.hpp:
#ifndef _LOGGER_HPP_
#define _LOGGER_HPP_
#include "event.hpp"
class Event; // Forward decl
// Class definitions
...
funktioniert nicht. Compiler sagt mir, dass in event.hpp gibt es einen nicht erkannt Typ Logger genannt (und er ist natürlich recht):
ISO C ++ verbietet Erklärung ‚Logger‘ ohne Typ
Compiler gibt mir die Zeile (in event.hpp), wo es die Freundschaft Erklärung ist.
2) In event.hpp:
#ifndef _EVENT_HPP_
#define _EVENT_HPP_
#include <string>
#include "logger.hpp"
class Logger; // Forward decl
// Class definitions
...
funktioniert nicht. Compiler sagt mir, dass in logger.hpp gibt es einen nicht erkannt Typ namens Ereignis (und wieder, es richtig aus offensichtlichen Gründen ist):
ISO C ++ verbietet Erklärung ‚Ereignis‘ ohne Typ
Compiler gibt mir die Zeile (in logger.hpp), wo es die Erklärung Operator ist.
Nun ja ... ich weiß nicht, wie dies zu stellen? Ich habe alles versucht, ich vorbringen Erklärungen überall, aber natürlich sind sie nicht helfen. Wie dieses Problem zu lösen ??? (Ich nehme an eine bewährte Methode existiert, besser hoffe ich :)).
Danke.
Lösung
Get die #include "event.hpp"
in logger.hpp
befreien - die Vorwärtserklärung class Event
genug sein soll, wenn alles, was Sie brauchen, ist ein Verweis auf ein Event
Objekt im Funktionsprototyp ist:
#ifndef _LOGGER_HPP_
#define _LOGGER_HPP_
// #include "event.hpp" // <<-- get rid of this line
class Event; // Forward decl
// Class definitions
...
Die Umsetzung der class Logger
in logger.cpp
wird wahrscheinlich brauchen event.hpp
aufzunehmen.
Andere Tipps
Wenn Sie nach vorn erklären, nicht in den #include
setzen. Machen Sie es wie
class Event;
class Logger {
public:
/*!
* Constructor
*/
Logger();
/*!
* Destructor
*/
~Logger();
/*!
* My operator
*/
Logger& operator<<(const Event& e);
private:
...
};
ohne #include "event.hpp"