Ich habe eine Klasse, die mehrere Arrays enthält, deren Größen durch Parameter zu seinem Konstruktor bestimmt werden können. Mein Problem ist, dass Instanzen dieser Klasse Größen haben, die nicht zur Kompilierzeit bestimmt werden können, und ich weiß nicht, wie man eine neue Methode zur Laufzeit weiß, wie groß ich mein Objekt sein muss. Jedes Objekt hat eine feste Größe, aber verschiedene Instanzen können unterschiedliche Größen haben.Verwenden Sie Konstruktor, um Speicher zuzuweisen
Es gibt mehrere Möglichkeiten, um das Problem:
- verwenden, um eine Fabrik
- verwenden, um eine Platzierung Konstruktor
- zuteilen Arrays in den Konstruktor und speichern Zeiger auf sie in meinem Objekt.
Ich bin ein alter Legacy-Code aus einer alten Anwendung in C geschrieben. Im ursprünglichen Code ermittelt das Programm, wie viel Speicher für das gesamte Objekt benötigt wird, ruft malloc()
für diesen Betrag auf und initialisiert die verschiedenen Felder.
Für die C++ - Version möchte ich in der Lage sein, einen (ziemlich) normalen Konstruktor für mein Objekt zu erstellen. Es wird ein Nachkomme einer Elternklasse sein, und ein Teil des Codes wird von Polymorphie abhängen, um die richtige Methode aufzurufen. Andere Klassen, die von demselben Elternteil abstammen, weisen zur Kompilierungszeit bekannte Größen auf und stellen somit kein Problem dar.
Ich möchte einige der besonderen Überlegungen vermeiden, die notwendig sind, wenn Platzierung neu verwendet wird, und ich möchte in der Lage sein, die Objekte auf eine normale Weise zu löschen.
Ich möchte vermeiden, im Körper meines Objekts Zeiger zu tragen, teilweise um Probleme mit dem Kopieren des Objekts zu vermeiden, und teilweise, weil ich so viel wie möglich des vorhandenen C-Codes wiederverwenden möchte. Wenn die Eigentumsrechte das einzige Problem wären, könnte ich wahrscheinlich nur gemeinsame Zeiger verwenden und mich nicht sorgen.
Hier ist eine sehr abgespeckte Version des C-Code, der die Objekte erstellt:
typedef struct
{
int controls;
int coords;
} myobject;
myobject* create_obj(int controls, int coords)
{
size_t size = sizeof(myobject) + (controls + coords*2) * sizeof(double);
char* mem = malloc(size);
myobject* p = (myobject *) mem;
p->controls = controls;
p->coords = coords;
return p;
}
Die Arrays innerhalb des Objekts eine feste Größe des Lebens des Objekts beizubehalten. Im obigen Code wird der Speicher nach der Struktur myobject
verwendet, um die Array-Elemente zu halten.
Ich fühle mich, als ob ich etwas offensichtlich fehlen könnte. Gibt es eine Möglichkeit, dass ich nicht weiß, einen (ziemlich) normalen Konstruktor in C++ zu schreiben, aber in der Lage zu sagen, wie viel Speicher das Objekt zur Laufzeit benötigt, ohne auf ein "Placement-Neu" -Szenario zurückzugreifen?
Ich verstehe Ihre Anforderung nicht, benötigen Sie speziell das Datenfeld in einem zusammenhängenden Block nach dem Speicher für das Objekt zugeordnet zugeordnet? Ansonsten gibt es keinen Grund, die Verwendung von 'std :: unique_ptr' oder 'std :: vector ' zu vermeiden. –
Jack
Anstatt Arrays variabler Größe oder dynamische Zuweisung zu verwenden, können Sie in Ihrer Klasse einen ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector) verwenden. Die Größe des Vektors ändert sich nie, so dass sich die Größe Ihrer Klasse niemals ändert. – NathanOliver
Warum konzentrieren Sie sich auf Placement neu? Gewöhnliche neue werden das Problem lösen, oder was? –