Hallo zusammen,
ich bastel gerade an einen Arduino (https://de.wikipedia.org/wiki/Arduino_(Plattform)) Microcontroller-Projekt, wo ich eine bestehende Bibliothek etwas umbauen/vereinfachen will.
Aber irgendwie hapert’s an meinen C++ Kenntnissen…
Kurz in Textform erklärt:
Ich habe eine Klasse die ein statisches Array anbietet. Die Library gibt vor, dass das Array vom Benutzer initialisiert und gefüllt werden soll.
In etwa so:
MyObject(...),
MyObject(...),
MyObject(...)
}
Das klappt soweit (weil: wurde nicht von mir gebaut :D).
Mein Ziel ist es jetzt, dass ich in das Array an Index=0 ein vordefinirrtes Objekt ablege, und der User sich nur noch um den restlichen Inhalt bemühen muss. Er soll von den vordefinierten Objekt an Index=0 aber eigentlich möglichst wenig sehen/mitbekommen.
Deshalb mein Ansatz:
Den User ein eigenes Array mit seinen Objekten erstellen lassen (also nicht das statische Nutzen) und dieses Array dann in einen sowieso notwendigen Methodenaufruf mit reinpacken.
In diesem Methodenaufruf wird das eigentlich vorgesehene statische Array mit der passenden Größe für “User-Objekte + Spezial-Objekt” erzeugt, an Index=0 das Spezialobjekt eingefügt und den Inhalt vom User-Array in das statische Array umkopiert.
Aber ich scheitere bereits am anlegen/initialisieren des statischen Arrays.
Ich hab das hier mal versucht in einem kurzen Code-Beispiel zu demonstrieren:
Datei A.* beherbergt das statische Array
Datei B.* beherbergt die Methode die das User-Array entgegen nimmt und dannd das statische Array initialisiert und befüllt
Datei A.h:
class A {
...
public:
static MyObject _myObjectList[];
...
}
Datei A.cpp:
include "A.h"
class A {
/* Verwendet überall und ständig "_myObjectList" im Stil von
* _myObjectList**.GetSomething()
*/
}
Datei B.h
class B {
...
public:
void init(..., MyObject anotherMyObjectList, ....);
private:
MyObject createSpecialMyObject();
...
}
Datei B.cpp
include "A.h"
include "B.h"
B:B() {
void B::init(..., MyObject anotherMyObjectList, ...) {
// ermittle Array-Größe von anotherMyObjectList
int len = sizeof(anotherMyObjectList) / sizeof(MyObject);
// initialisiere A::_myObjectList[] für Arraygröße "len+1"
// ---> ???
// bisheriger kläglicher Versuch:
A::_myObjectList = (MyObject*) malloc(sizeof(MyObject)*(len+1));
//
// Fehler: "invalid use of array with unspecified bounds"
// Zusätzlich bekomm ich noch den Fehler in/für A.h:
// error: "A::_myObjectList" has incomplete type. ----> Kann ich mir noch weniger erklären...
// platziere ein "spezielles" MyObject an Index 0
A::_myObjectList[0] = createSpecialMyObject();
// füge Inhalt von anotherMyObjectList danach ein
for(int i=1; i<(len+1); i++) {
A::_myObjectList** = anotherMyObjectList[i-1];
}
}
MyObject B::createSpecialMyObject() {
MyObject m = MyObject(....);
m.SetSomething(...);
m.SetSomethingElse(...);
return m;
}
}
Rahmenbedingungen:
Die Definition des statsichen Arrays in A.h muss bleiben wie sie ist, bzw. darf sich nicht soweit ändern, dass bisherige Zugriffe angepasst/geändert werden müssen (das wäre zuuuu viel arbeit das alles umzubauen).
Kann mir da jemand unter die Arme greifen?
Kann doch nicht so schwer sein. In Java hätte ich das in nichtmal einer Minute gelöst. Mit C++ mach ich jetzt schon 2 Tage rum und kriegs nicht gebacken. Aber vielleicht seh ich mal wieder den Wald vor lauter Bäumen nicht.
Gruß
Alex