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.

War es hilfreich?

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"

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top