【问题标题】:Compile time "null" using forward declaration?使用前向声明编译时间“null”?
【发布时间】:2016-08-01 08:48:29
【问题描述】:

我在使用前向声明时遇到问题,我不知道如何解决。这是我的文件:

BubblePlug.h

#ifndef _BUBBLEPLUG_
#define _BUBBLEPLUG_

#include "IPlug_include_in_plug_hdr.h"
#include "resource.h"
#include "IControl.h"

class IPianoRoll;
class IMidiEngine;

class BubblePlug: public IPlug
{
private:

public:
    IMidiEngine *pMidiEngine;
    IPianoRoll *pPianoRoll;

    BubblePlug(IPlugInstanceInfo instanceInfo);
    ~BubblePlug();
};

#endif // !_BUBBLEPLUG_ 

BubblePlug.cpp

#include "BubblePlug.h"
#include "IPlug_include_in_plug_src.h"
#include "IPianoRoll.h"
#include "IMidiEngine.h"

BubblePlug::BubblePlug(IPlugInstanceInfo instanceInfo) : IPLUG_CTOR(10, 1, instanceInfo) {
    pPianoRoll = new IPianoRoll(this, 8, 8);
    pMidiEngine = new IMidiEngine(this);
}
BubblePlug::~BubblePlug() { 
    delete pPianoRoll;
    delete pMidiEngine;
}

IPianoRoll.h

#ifndef _IPIANOROLL_
#define _IPIANOROLL_

#include "IMidiEngine.h"

class IPianoRoll : public IControl
{
private:
    BubblePlug *pBubblePlug;

public:

    IPianoRoll(BubblePlug *bubbleplug, int x, int y) : IControl(bubbleplug, IRECT(x, y, x + 10, y + 10)), pBubblePlug(bubbleplug) {

    }
    ~IPianoRoll() {

    };

    bool Draw(IGraphics *pGraphics) {
        return true;
    }

    void Random(bool onlyScore = false) {
        pBubblePlug->pMidiEngine->Init();
    }

    void Start() {

    }
};

#endif // !_IPIANOROLL_ 

IMidiEngine.h

#ifndef _IMIDIENGINE_
#define _IMIDIENGINE_

class IMidiEngine
{
private:
    BubblePlug *pBubblePlug;

public:
    IMidiEngine(BubblePlug *bubbleplug) : pBubblePlug(bubbleplug) {

    }
    ~IMidiEngine() {

    };

    void Init(bool randomScore = true) {
        pSamplwhk->pPianoRoll->Start();
    }
};

#endif // !_IMIDIENGINE_    

当我编译时,它会显示pSamplwhk->pPianoRoll->Start();:

use of undefined type 'IPianoRoll'
left of '->Start' must point to class/struct/union/generic type

VS2015 找到每个元素编写代码(我没问题),它仅在我编译(构建)时发生。

为什么?我通过BubblePlug 并且我在IPianoRollIMidiEngine 前面都做了,包括它们的顺序(在BubblePlug.cpp 上)。

IMidiEngine 应该知道关于IPianoRoll 的一切(它首先包含在内)。

至少,我应该在“运行时”遇到问题,为什么在编译时?

您能帮我理解问题以及如何解决它吗?谢谢。

【问题讨论】:

  • 尝试将#include "IMidiEngine.h"添加到IPianoRoll.h
  • @alexeykuzmin0:我已经编辑了这个问题。看看吧!
  • 无关:您的包含保护是非法的。 stackoverflow.com/questions/228783/…

标签: c++ pointers compilation compiler-errors forward-declaration


【解决方案1】:

IPianoRoll.h 包含 IMidiEngine.h,因此无论您以何种顺序包含这两个文件,IPianoRoll 的定义总是在使用它的init 函数之后。

避免这种情况的一种方法是将init 函数的主体移动到单独的.cpp 文件中:

在 IMidiEngine.h 中:

void Init(bool randomScore=true);

在 IMidiEngine.cpp 中:

void IMidiEngine::Init(bool randomScore) {
    pSamplwhk->pPianoRoll->Start();
}

【讨论】:

  • 现在我明白了问题所在。由于添加了“一次”,IPianoRoll 就变成了一直在 IMidiEngine 之后。所以IMidiEngine不知道IPianoRoll的Start方法吧?为什么分开的文件可以解决问题?这就是我不理解的。在编译时首先如果包含 .h,而不是“编译”.cpp?
  • 您必须确保看到类的定义,然后才能使用它。我建议的解决方案是这样做的:它将函数体移动到编译的稍后位置,编译器已经看到了这两个定义。
  • @paizza - 在 .cpp 文件中,首先包含 everything - 在函数体中可见。在头文件中,您看不到下一个头文件中的内容。
  • 现在开始明白为什么会有 .cpp 和 .h 文件了 :)
猜你喜欢
  • 2010-10-08
  • 1970-01-01
  • 2019-11-04
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
相关资源
最近更新 更多