如何调用虚拟虚空函数C++
How to call a virtual void function C++?
我在网上发现了一个练习。这个练习包括我以前从未见过的"虚拟空白"是如何工作的。因此,该练习包含 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);
}
不幸的是,它没有运行,它说我对"计划::应用计划(计划::行动&)"有未定义的引用,所以我的问题是你如何传递那些给定参数的函数?
您在头文件中声明了"void applyPlan(HumanActions &actions)",但您尚未在任何地方定义(实现)它,这就是您拥有未定义符号的原因。
如果在main()中,你调用了applyZombiePlan()而不是applyPlan(),你应该没问题。
未定义的引用"是一个链接器错误,表示找不到函数的实现。 换句话说,这通常意味着您声明了函数并调用了函数,但忘记实际编写函数。
您的错误消息指的是plans::applyPlan(plans::Actions&)
,但我看到的最接近的声明是 void applyPlan(HumanActions &actions);
,它具有不同的参数类型。 假设这不仅仅是您帖子中不同版本的代码之间的混淆,您可能不小心声明了两个不同的applyPlan
函数,但只实现了其中一个。
如果您的程序包含多个.cpp
文件,另一个可能的原因是您不小心尝试编译和链接单个文件,就好像它是一个完整的程序,而不是将所有模块链接在一起。 这将使链接器看不到其他.cpp
文件中定义的任何内容。 如果您是初学者,最好的选择是使用单个命令行一次编译所有源文件,例如 g++ *.cpp -o myprog
.
虚函数与调用常规函数没有什么不同,顺便说一句,applyPlan
无论如何都不是虚函数。
我认为你可以使用 extern 关键字。 每当你实际定义全局函数时,你可以说void XYZ(){},在其他任何地方你可以说extern void XYZ()。
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗