我正在使用功能有限的嵌入式平台,因此无法使用矢量/ STL。
这可能是一个微不足道的问题,但我在C ++方面没有太多经验(只有C和C#,这可能让我对显而易见的c ++方法视而不见)。
考虑以下示例:
class Parent {
};
class Child : public Parent {
};
void Test(Parent* parents, uint8_t parentCount) {
// Accessing parent[x] is problematic when 'parents' contains a derived type
}
int main() {
// This is OK
Parent parents[3];
Test(parents, 3);
// This causes problems
Child children[3];
Test(children, 3);
return 0;
}
如果提供了指向派生类数组的指针,那么在 Test()中迭代父显然是有问题的,因为的内存占用在迭代期间假定父。
我看到的唯一解决方案是传递一个类型为 Parent (Parent ** parents)的指针数组,但这看起来很麻烦。是否有一些我不知道的C ++机制,比如将数组作为引用或其他东西传递?
答案 0 :(得分:6)
你可以使用这种方法:
template <class T>
void Test(T* parents, uint8_t parentCount) {
// Code that accesses parent[x]
}
然后像这样使用它:
int main() {
Parent parents[3];
Test(parents, 3);
Child children[3];
Test(children, 3);
return 0;
}
答案 1 :(得分:3)
如果模板不是一个选项,并且Test
的用户不能依赖Child
并且甚至不知道它的大小,那么你可以使用一个数组指针:
void Test(Parent** parents, uint8_t parentCount);
int main() {
Child children[n];
Child* pointers[n];
for(int i = 0; i < n; i++)
pointers[i] = &children[i];
Test(pointers);
}
请注意,在这个简单的例子中,我们做知道我们传递指针的对象的大小,但一般来说,我们可能无法为{{1 }}
答案 2 :(得分:1)
如果您无法使用模板,则可以执行以下操作:
{{1}}