如何调用虚拟void函数C ++?

时间:2016-01-20 03:15:43

标签: c++ function linker-errors

我偶然发现了一个在线发现的练习。 此练习包括"虚拟空白"我以前从未见过如何运作。 因此,练习包含1个名为plans.h的头文件

namespace plans {

class HumanActions {
public:
  virtual void goTo() { }
  virtual void haveANiceColdBeer() { }
};

void applyPlan(HumanActions &actions);

}

和一个cpp文件

#include "Plans.h"

using plans::HumanActions;
using plans::applyPlan;

void
plans::applyPlan(HumanActions &actions) {
  actions.goTo();
  actions.haveANiceColdBeer();
}

我尝试通过运行另一个像

运行的主文件来运行该函数
#include "Plans.h"

using plans::HumanActions;
using plans::applyPlan;

int main() {
    HumanActions actions;
    applyPlan(actions);
}

不幸的是它没有运行,它说我有未定义的引用`plans :: applyPlan(plans :: Actions&)'所以我的问题是你如何传递这些论点的函数?

3 个答案:

答案 0 :(得分:1)

您已声明" void applyPlan(HumanActions& actions)"在头文件中,但你没有在任何地方定义(实现)它,这就是为什么你有未定义的符号。

如果在main()中,你调用applyZombiePlan()而不是applyPlan(),你应该没问题。

答案 1 :(得分:1)

“未定义的引用”是链接器错误,表示无法找到函数的实现。换句话说,它通常意味着你声明了函数,并调用了函数,但忘了实际函数。

您的错误消息是指plans::applyPlan(plans::Actions&),但我看到的最接近的声明是void applyPlan(HumanActions &actions);,它具有不同的参数类型。假设这不仅仅是您帖子中不同版本的代码之间的混淆,您可能会意外地声明了两个不同的applyPlan函数,但只实现了其中一个。

如果您的程序包含多个.cpp文件,另一个可能的原因是您不小心尝试编译并链接单个文件,就好像它是一个完整的程序一样将所有模块链接在一起。这会使链接器看不到其他.cpp文件中定义的任何内容。如果您是初学者,最好的办法是使用一个命令行一次编译所有源文件,例如: g++ *.cpp -o myprog

调用虚函数与​​调用常规函数BTW无异,而且applyPlan无论如何都不是虚函数。

答案 2 :(得分:0)

我认为您可以使用extern关键字。无论何时实际定义全局函数,都可以说void XYZ(){}以及其他任何地方你可以说extern void XYZ()。