将一组Child对象传递给接受Parent *的函数

时间:2016-04-28 12:30:26

标签: c++ c++11 embedded avr-gcc

我正在使用功能有限的嵌入式平台,因此无法使用矢量/ 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 ++机制,比如将数组作为引用或其他东西传递?

3 个答案:

答案 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}}