2016-04-28 10 views
2

Ich arbeite an einer eingebetteten Plattform mit eingeschränkten Funktionen, so dass Vektoren/STL nicht verfügbar sind.Übergabe eines Arrays von Child-Objekten an eine Funktion, die Parent akzeptiert *

Dies kann ein triviales Problem sein, aber ich habe nicht viel Erfahrung in C++ (nur C und C#, die mich blind für eine offensichtliche C++ - Methode machen kann).

betrachten das folgende Beispiel:

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

Offensichtlich es problematisch ist, über Eltern in -Test iterieren(), wenn ein Zeiger auf ein Feld von abgeleiteten Klassen zur Verfügung gestellt, da der Speicherplatzbedarfs von Parent wird während der Iteration angenommen.

Die einzige Lösung, die ich sehe, ist ein Array von Zeigern vom Typ Eltern (Parent ** Eltern) passieren, aber das scheint umständlich. Gibt es einen C++ - Mechanismus, den ich nicht kenne, wie das Array als Referenz oder etwas zu übergeben?

+2

"Test" zu einer Vorlagenfunktion machen? Verwenden Sie ein Array von Zeigern (nicht, dass ich es wirklich empfehlen würde, es sei denn, Ihre Klassen sind polymorph). Die Lösung (diese oder andere) hängt sehr vom Anwendungsfall ab. –

Antwort

4

Sie diesen Ansatz verwenden:

template <class T> 
void Test(T* parents, uint8_t parentCount) { 
    // Code that accesses parent[x] 
} 

und es dann wie folgt verwenden:

int main() { 

    Parent parents[3]; 
    Test(parents, 3); 

    // This causes problems 
    Child children[3]; 
    Test(children, 3); 

    return 0; 
} 
+1

Sie sollten den Schablonentyp für die Funktion nicht angeben. Sie sollten den Compiler für Sie ableiten lassen. – NathanOliver

+0

@NathanOliver Sie haben Recht. Ich habe meine Antwort aktualisiert. –

+0

Wie ich bereits erwähnte, ist die Standardvorlagenbibliothek nicht verfügbar. –

1

Wenn Sie keine Vorlagen verwenden können, können Sie dies tun:

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])); 
} 
+0

Interessanter, aber etwas chaotischer Ansatz. Ich hoffte, C++ würde die Dinge sauberer machen;) Ich würde mir im Vergleich dazu den Ansatz "Array of Pointer" vorziehen. Danke für die Rückmeldung. –

+0

@ Rev1.0: Nun, die "Array of Pointer" -Ansatz ist weniger effizient, und ich dachte, Sie würden das nicht wollen, da Sie scheinbar auf einem super-Constrained-System sind, aber es ist sicherlich praktikabel. –

1

Wenn Vorlage keine Option ist und wenn der Benutzer von Test nicht auf Child angewiesen ist und nicht ev. Kann en wissen, dass es eine Größe ist, dann können Sie ein Array von Zeigern verwenden:

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

Beachten Sie, dass beispielsweise in diesem trivial, wir die Größe des Objekts wissen tun deren Zeiger passieren wir, aber im Allgemeinen, können wir nicht in der Lage sein, diese Annahme für alle Benutzer von Test zu treffen.

+0

Dieser Ansatz war mein erster, um mich selbst zu zitieren: "Die einzige Lösung, die ich sehe, besteht darin, ein Array von Zeigern vom Typ Parent (Eltern ** Eltern) zu übergeben, aber das scheint umständlich." Aber danke, das zu überprüfen. –

+0

@ Rev1.0 Ja, ich habe es bemerkt. Dies ist hier für die Menschen, die nach einer Lösung suchen und an die die anderen Antworten nicht möglich sind. – user2079303

Verwandte Themen