本質上,我試圖解決無法將派生類型作爲派生類型存儲在基類型的(值)數組中的問題。我有多個存儲一到三個整數的類,但必須有非常不同的函數集。我會使用一個指針數組,但是整個數組是向前遍歷的,然後不斷地向後遍歷,主要是線性的,所以把它們全部放在內存中是比較好的。我可以創建多個數組,每個類型都有一個數組,然後是指向每個數組的指針數組,但是這樣做會非常笨拙,實際上不會像每個元素在前一個元素和後一個元素之間整齊排列一樣它按運行時訪問的順序排列。指向類類型的指針
所以我在想的是,我用三個整數和一個指針做一個POD結構,然後用這些指針填充一個數組,然後使用該指針訪問多態函數。它最終會沿着這些路線的東西:(此處原諒糟糕的編碼,我只是想傳達的概念)
class A {
int aa(&foo f) { return 1; }
int dd() { return 9; }
};
class B : A {
int aa(&foo f) { return f.b; }
};
class C : A {
int aa(&foo f) { return cc() + f.c - f.a; }
int cc() { return 4; }
};
class D : B {
int dd() { return 7; }
};
struct foo{ int a, b, c; A* ptr; };
const A AA = A(); const B BB = B(); const C CC = C(); const D DD = D();
foo[100] foos;
init() {
foo[0] = foo{ 1, 2, 3, &BB };
// etc fill foos with various foo elements
}
bar(){
for (int i = 0; i < 100; ++i){
print foos[i].ptr.aa(&foos[i]);
print foos[i].ptr.dd();
}
}
main(){
init();
while(true)
bar();
}
我只是想知道這是否是去了解我想要的東西的最佳方式實現還是有更好的解決方案?理想情況下,我只是指向一個類而不是一個類的實例,但我不認爲我真的可以這樣做...... 理想情況下我會將它們作爲多個派生類型存儲在數組中,但出於顯而易見的原因不會飛。
是否有一個原因,你不能只使用歧視聯盟,如Boost.Variant? – Useless 2015-02-06 10:35:38
除了從來沒有遇到過他們?我不確定。我如何在保持相同類型的同時在每個函數中沒有一堆笨拙的開關語句的情況下製作一個多態的? – User6897 2015-02-06 13:12:17
好吧,只是檢查你是否知道他們,並排除他們。他們應該做你所需要的事情,用訪問而不是轉換語句。 – Useless 2015-02-06 16:53:08