【发布时间】:2015-04-06 11:12:22
【问题描述】:
基本上,我正在尝试解决无法将派生类型作为派生类型存储在基类型的(值)数组中的问题。我有多个类存储一到三个整数,但必须具有非常不同的函数集。我会使用一个指针数组,但是整个数组会向前遍历,然后不断向后遍历,主要是线性的,因此最好将它们全部放在内存中。我可以创建多个数组,每个类型一个,然后一个指向每个类型的指针数组,但这会很快变得非常笨拙,并且实际上与每个元素整齐地包装在它前面的元素和一个过程之间的元素不同它按运行时的访问顺序。
所以我在想的是,我用三个整数和一个指针创建一个 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?
-
除了从来没有遇到过?我不知道。在每个函数中没有一堆笨拙的 switch 语句的情况下,如何在保留相同类型的同时创建一个多态?
-
好的,只是检查您是否了解它们并排除了它们。他们应该做你需要的事情,用访问而不是 switch 语句。
标签: c++ arrays function class pointers