1. ホーム
  2. c++

[解決済み] 相互参照ヘッダで「終了していない条件付き指示」というエラーが発生する

2022-01-28 07:06:27

質問

ヘッダーで互いに関連する2つのクラスがあります。

プロットマーカー

#ifndef PLOTMARKER_H
#define PLOTMARKER_H

#include <QObject>
#include "plotter.h"

class Plotter;

class PlotMarker : public QObject
{
    // ...
    Plotter* m_attachedPlot;    
    // ...
};

#endif // PLOTMARKER_H

プロッタ

#ifndef PLOTTER_H
#define PLOTTER_H

// ...
#include "plotmarker.h"
// ...

class PlotMarker;

class Plotter : public QQuickPaintedItem
{
    // ...
    QLinkedList<PlotMarker*> m_markerList;
    // ...
};

#endif // PLOTTER_H

プログラムはうまくコンパイルされていますが、エラーが出ています。 error: unterminated conditional directive#ifndef で、IDEのクラスのコードがハイライトされないのは、そのせいです。

を削除すると #include "plotter.h" は、PlotMarkerのヘッダまたは #include "plotmarker.h" をプロッタのヘッダに挿入すると、Qt Creator は通常通りコードをハイライトしますが、不完全な型の無効な使用に関するエラーのため、コンパイルに失敗します。

何が問題なのか、教えてください。ヘッダーの相互参照が間違っているせいだと思うのですが、私は これ と表示され、何の役にも立ちませんでした。

解決方法は?

問題は解決しました。

の1つを移動させただけです。 #include をヘッダからソースファイルへ移動させたところ、うまくいきました。

plotmarker.h

#ifndef PLOTMARKER_H
#define PLOTMARKER_H

#include <QObject>

class Plotter;

class PlotMarker : public QObject
{
    // ...
    Plotter* m_attachedPlot;    
    // ...
};

#endif // PLOTMARKER_H

// ...

plotmarker.cpp

#include "plotmarker.h"
#include "plotter.h"
// ...