本质上,我试图解决无法将派生类型作为派生类型存储在基类型的(值)数组中的问题。我有多个存储一到三个整数的类,但必须有非常不同的函数集。我会使用一个指针数组,但是整个数组是向前遍历的,然后不断地向后遍历,主要是线性的,所以把它们全部放在内存中是比较好的。我可以创建多个数组,每个类型都有一个数组,然后是指向每个数组的指针数组,但是这样做会非常笨拙,实际上不会像每个元素在前一个元素和后一个元素之间整齐排列一样它按运行时访问的顺序排列。指向类类型的指针
所以我在想的是,我用三个整数和一个指针做一个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