【问题标题】:Forward Declaration linker error前向声明链接器错误
【发布时间】:2016-06-17 02:49:39
【问题描述】:

noobie程序员在这里~

我正在尝试从我的演讲幻灯片中复制一些代码,但是,幻灯片没有显示头文件设置。两个类使用彼此(Agent 和 IBehaviour),所以在娱乐时我遇到了一个循环包含。我尝试使用前向声明解决方案(在 IBehaviour 中)来解决我的问题,但是现在我遇到了一个未解决的外部错误......'

我想我可以看到我的问题 ~ 我有一个函数接收指向 IBehaviour.h 中不完整类型的指针,但是我不知道如何解决这个问题。

非常感谢任何帮助。以下代码已压缩为 h 文件以供阅读。

Agent.h

#pragma once
#include "IBehaviour.h"
#include <list>

class Agent
{
public:
    Agent();
    ~Agent();
    void Update();

protected:
    std::list<IBehaviour*> m_behaviours;
};

Agent::Agent()
{
}

Agent::~Agent()
{
}

void Agent::Update()
{
    for (auto iter = m_behaviours.begin(); iter != m_behaviours.end(); iter++)
        (*iter)->Update(this);
}

IBehaviour.h

class Agent;

class IBehaviour
{
public:
    IBehaviour();
    ~IBehaviour();

    virtual void Update(Agent* pAgent);
};

IBehaviour::IBehaviour()
{
}


IBehaviour::~IBehaviour()
{
}

void IBehaviour::Update(Agent * pAgent)
{
}

SeekB

#pragma once
#include "IBehaviour.h"

class SeekB : public IBehaviour
{
public:
    SeekB();
    ~SeekB();

    void Update(Agent *pAgent) override;
};

SeekB::SeekB()
{
}


SeekB::~SeekB()
{
}

void SeekB::Update(Agent * pAgent)
{
    // Apply seek force to pAgent
}

【问题讨论】:

    标签: c++ header forward-declaration


    【解决方案1】:

    由于IBehaviour.h 仅处理指向类Agent 的指针,并且没有使用该指针的实现,因此前向声明很好。

    当您开始使用该指针时,您需要包含完整的类声明,而不仅仅是前向声明。我假设您的 SeekB使用 Agent 类,而不仅仅是持有指向它的指针,因此您需要在 SeekB.h 文件中使用 #include "Agent.h"

    除此之外,我在您的代码中没有看到任何循环包含...

    【讨论】:

    • 您好,感谢您的回答。我已经一起删除了 seek 类。问题在于代理和 IBehaviour 类之间。我试图删除所有循环包含,但是程序仍然无法编译...错误是:函数“int_cdecl invoke_main(void)”(?invoke_main@@YAHXZ)中引用的未解析的外部符号_main
    • 然后可能要添加main() 函数。 ;-) 从好的方面来说,你至少可以知道你正在正确地进行前向声明!
    【解决方案2】:

    求主怜悯,我没有 main 函数。对不起家人

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 2012-08-24
      • 2016-06-30
      相关资源
      最近更新 更多