Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译时“;空";使用远期申报?_C++_Pointers_Compilation_Compiler Errors_Forward Declaration - Fatal编程技术网

C++ 编译时“;空";使用远期申报?

C++ 编译时“;空";使用远期申报?,c++,pointers,compilation,compiler-errors,forward-declaration,C++,Pointers,Compilation,Compiler Errors,Forward Declaration,我在使用转发声明时遇到了一个问题,我不知道如何解决它。这是我的档案: 气泡塞.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: p

我在使用转发声明时遇到了一个问题,我不知道如何解决它。这是我的档案:

气泡塞.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_ 
#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_    
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;
}
ipianroll.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 _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_ 
#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()

VS2015找到编写代码的每个元素(我没有问题),只有在编译(构建)时才会发生

为什么??我通过了
BubblePlug
,并转发了
ipianroll
IMidiEngine
,按顺序包括它们(在
BubblePlug.cpp

IMidiEngine
应该知道关于
ipianroll
的所有事情(首先包括它)

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


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

ipianroll.h包含IMidiEngine.h,因此无论您以何种顺序包含这两个文件,ipianroll的定义都将始终位于使用它的
init
函数之后

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

在IMidiEngine.h中:

void Init(bool randomScore=true);
在IMidiEngine.cpp中:

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

尝试将
#包括“IMidiEngine.h”
添加到ipianroll。h@alexeykuzmin0当前位置我已经编辑了这个问题。过来看!无关:你的包括警卫是非法的。现在我明白问题所在了。由于它加上了“一次”,伊帕诺尔就变成了总是在亚胺丁烷之后。所以IMidiEngine不知道IPianoRoll的启动方法,对吗?为什么Sperate文件可以解决这个问题?这就是我不明白的。在编译时,如果include.h大于“compile.cpp”,则必须确保在允许使用类之前看到类的定义。我建议的解决方案是这样的:它将函数体移动到编译中的稍后点,编译器已经看到了这两个定义。@paizza-在.cpp文件中,所有内容都是首先包含的-因此在函数体中可见。在头文件中,您无法看到下一个头文件中的内容。现在开始理解为什么会有.cpp和.h文件:)