在我的一個C 程式中,我遇到了一點設計障礙,因為兩個不同的頭檔案需要相互參考。通常情況下,這里會使用正向宣告,但由于兩個類都使用了模板函式/建構式,所以不能使用正向宣告,因為需要使用兩個類的方法/變數。
例如,請考慮以下場景(這是作為示例的偽代碼,可能/可能無法編譯。這些物件是我的實際應用的代表,所以如果有必要進行重新設計,那么我很想了解我做錯了什么的設計理念)
// Application.hpp
#include <Assets.hpp>/span>
#include <Logger.hpp>/span>
class Application {
public:
///這里有一些精彩的代碼......
Logger myLogger。
template <int someArrayLen> Application(std::array<int, someArrayLen> myArr, SomeOtherTypes someOtherStuff) 。myLogger( stuffHere) {
mainAssets = new Assets(myArr)。
}
~Application(); //假設這是在Application.cpp中實作的,并且有洗掉mainAssets; }; new(myArr); Assets(myArr)
};
extern Application* mainApp; // 假設Application* mainApp = nullptr; in Application.cpp
// Assets.hpp
// #include <Application.hpp> ???? 問題出在這里
class Assets {
private:
//隨機資料結構/用于保存著色器/紋理/等等的東西。
protected:
template <int someArrayLen> Assets(std::array<int, someArrayLen> myArr){
if (!shadersSupported() ) {
//主應用程式是一個未知的符號。
mainApp->myLogger->error("Your GPU is too old/whatever!") 。
}
//基于我的模板東西加載資產的隨機代碼。
}
friend class Application。
public:
//在這里獲取資產/什么的。
};
extern Assets* mainAssets; // 假設Assets* mainAssets = nullptr; in Assets.cpp
我怎樣才能解決關于mainApp是一個未知符號的編譯錯誤?希望得到任何反饋/幫助,謝謝!
我已經看了一遍,但沒有發現任何問題。
我已經看了以下所有的問題,但是沒有一個問題是針對這個獨特的場景的:
我已經看了以下所有的問題,但是沒有一個問題是針對這個獨特的場景的。
- 兩個相互參考的類。
- 這個問題沒有任何意義。
- 這個問題沒有使用模板,所以可以使用正向宣告,因為方法體沒有在頭檔案中定義
。
- 這個問題的解決方案不能使用,因為在這里,編譯器無法計算出要分配多少記憶體,而在我的問題中,問題不在于編譯器對分配多少記憶體感到困惑,而在于要參考什么
- 這個問題涉及到回圈依賴的設計缺陷,而我的應用程式沒有這種缺陷,這兩個類都是全域存盤的,它們只是在不同的構造器中實體化,這些構造器相互參考。
- 本問題提供了正向宣告作為解決方案,由于要求在模板函式定義中使用類方法/建構式,所以這里不能使用。
我也已經考慮了以下幾點:
uj5u.com熱心網友回復:
前向宣告的確可以解決你的問題。關鍵是函式模板可以在行外定義(即不在你的class ... { };宣告中)合法地。使用inline關鍵字,可以為任意函式實作同樣的效果。
現在要解決你的具體問題,只需將Application.hpp分成Applicaton_fwd.hpp和Application.hpp - 類似于iosfwd. Application_fwd.hpp包含了幾乎所有的代碼,Application.hpp在定義Application::Application函式模板(就像你在*.cpp檔案中定義一個函式一樣)之前,包括Application_fwd.hpp和Assets.hpp。
在Assets.hpp中,你可以簡單地使用Application_fwd.hpp,只要你不使用建構式。如果你也使用Assets.hpp中的Application建構式,事情就變得有點復雜了,因為你需要非常仔細地考慮所有可能的包含情況(即,每次你的一個頭檔案被自己或用戶包含時到底會發生什么),以確保它按照你需要的順序決議,而不會被守護者帶來麻煩。
你可以看到它的運行情況這里
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/313399.html
標籤:
上一篇:在以下情況下,是否有更創新的方法來處理null例外?
下一篇:多樣化的物件的OOP方法
