簡體   English   中英

將一組Child對象傳遞給接受Parent *的函數

[英]Passing an array of Child objects to a function that accepts Parent*

我正在使用功能有限的嵌入式平台,因此無法使用矢量/ 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 (Parent ** parents)的指針數組,但這看起來很麻煩。 是否有一些我不知道的C ++機制,比如將數組作為引用或其他東西傳遞?

你可以使用這種方法:

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;
}

如果模板不是一個選項,並且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);
}

注意,在這個簡單的例子,我們知道它的指針,我們通過對象的大小,但在一般情況下,我們可能不能夠做這樣的假設為所有用戶Test

如果您無法使用模板,則可以執行以下操作:

class Parent {
};

class Child : public Parent {
};

void Test(Parent* parents, uint8_t parentCount, uint16_t parentSize) {
    for (uint8_t ii = 0; ii < parentCount; ++ii) {
        void* parentvoid = reinterpret_cast<char*>(parents) + ii * parentSize;
        Parent* parent = parentvoid;
    }
}

int main() {
    Parent parents[3];
    Test(parents, 3, sizeof(parents[0]));

    Child children[3];
    Test(children, 3, sizeof(children[0]));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM