我偶然发现了一个在线发现的练习。 此练习包括"虚拟空白"我以前从未见过如何运作。 因此,练习包含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&)'所以我的问题是你如何传递这些论点的函数?
答案 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()。