gpt4 book ai didi

c++ - 使用前向声明编译时间 "null"?

转载 作者:行者123 更新时间:2023-11-30 05:24:21 24 4
gpt4 key购买 nike

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

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 找到每个编写代码的元素(我没问题),它只在我编译(Build)时发生。

为什么?我通过了 BubblePlug 并向前推进了 IPianoRollIMidiEngine,按顺序包括它们(在 BubblePlug.cpp 上).

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

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

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

最佳答案

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();
}

关于c++ - 使用前向声明编译时间 "null"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38694545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com