我有一個作為介面的 Game 類,以及兩個實作這個介面的 Poker 和 BlackJack 類。我有這個方法回傳一個游戲物件串列,然后我可以使用:
#include "Poker.h"
#include "BlackJack.h"
...
std::vector<Game*> getGames() {
std::vector<Game*> gs;
Game* p = new Poker();
gs.push_back(p);
Game* b = new BlackJack();
gs.push_back(b);
return gs;
}
目前它只能回傳一個包含這兩個類的串列。我希望能夠撰寫此介面的更多實作或獲取其他人的實作,將 CPP 檔案放在某個目錄中,并能夠呼叫此方法,除了現在向量還包含此新類的實體。
到目前為止,我有:
std::string path = "/Games";
std::vector<std::string> filePaths;
for (const auto& file : std::filesystem::directory_iterator(path)) {
filePaths.push_back(file.path().string());
}
它在某個目錄中創建了一個檔案路徑串列。
我不知道如何從這里繼續,因為為了使用這些檔案,我每次都必須添加一個包含陳述句。最終目標是擁有一個程式,用戶可以很容易地將他們自己的游戲匯入其中。我怎么能去做這件事?
uj5u.com熱心網友回復:
如何包含尚不存在的 CPP 檔案?
你不能。您只能包含已存在的檔案。
理論上,您可以使用元編程實作您想要的。即:撰寫一個程式,撰寫一個包含所有頭檔案的頭檔案。然后包含元程式生成的標題。要更新串列,請重新運行元程式。您可以在編譯之前自動執行構建程序。
但是,在這種情況下,我看不出這是一個好主意。為了getGames改變,你無論如何都必須改變函式。只需在添加使用標題的代碼時添加 include 指令...除非您也使用元編程來生成函式,這可能是合理的。但在選擇這種設計之前,請考慮元編程增加的復雜性。
最終目標是擁有一個程式,用戶可以很容易地將他們自己的游戲匯入其中。
如果目標是讓用戶在您的程式編譯后執行此操作,那么它根本不起作用。您需要更徹底地描述您的目標,以便我提出更好的方法。
PS 避免使用裸擁有指標。在這種情況下,我建議std::vector<std::unique_ptr<Game>>改用。
uj5u.com熱心網友回復:
你可以考慮包含一個像gamelist.h這樣的檔案嗎?當您想使用預生成的事件構建專案時,您可以生成它
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/376235.html
