[英]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);
}
不幸的是它沒有運行,並且說我對“ plans :: applyPlan(plans :: Actions&)”有未定義的引用,所以我的問題是如何傳遞給定參數的函數?
您已經在頭文件中聲明了“ void applyPlan(HumanActions&actions)”,但尚未在任何位置定義(實現)它,這就是為什么您有未定義符號的原因。
如果在main()中,您調用了applyZombiePlan()而不是applyPlan(),則應該沒問題。
“未定義的引用”是一個鏈接器錯誤,表示找不到函數的實現。 換句話說,這通常意味着您聲明了該函數並調用了該函數,但是卻忘記了實際編寫該函數。
您的錯誤消息引用了plans::applyPlan(plans::Actions&)
,但是我看到的最接近的聲明是void applyPlan(HumanActions &actions);
,具有不同的參數類型。 假設這不僅是帖子中不同版本的代碼之間的混淆,您可能不小心聲明了兩個不同的applyPlan
函數,但只實現了其中一個。
如果您的程序包含多個.cpp
文件,則另一個可能的原因是您無意間試圖像編譯一個完整程序一樣編譯和鏈接一個文件,而不是將所有模塊鏈接在一起。 這會使鏈接器看不到其他.cpp
文件中定義的任何內容。 如果您是初學者,最好的選擇是使用單個命令行一次編譯所有源文件,例如g++ *.cpp -o myprog
。
調用虛擬函數與調用常規函數BTW沒什么不同, applyPlan
也不是虛擬函數。
我認為您可以使用extern關鍵字。 每當您實際定義全局函數時,都可以說void XYZ(){},而其他任何地方都可以說extern void XYZ()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.