Probleme mit Standartkonstruktor
-
Hallo,
könnt ihr mir sagen, warum solche eine Deklaration Probleme macht:TStrinGrid grid[7];
Laut der Fehlermeldung wurde kein Standartkonstruktor gefunden. Warum funktioniert nur das:
TStrinGrid *grid[7];
Vielen Dank
lg, freakC++PS.: Warum muss im "VCL Stil" immer mit Pointern gearbeitet werden?
-
Ist halt so. Alles, was von TObject abgeleitet ist kann nur dynamisch erzeugt werden, hab mich auch schon etliche Male drüber aufgeregt. Aber mit boost::shared_ptr lässt sich das ganz gut in den Griff kriegen.
-
Mmmh...ok! Und wie kann ich ein dynamisches Array erzeugen, dass StringGrids enthält? Das funktioniert nämlich genauso wenig:
TStringGrid *tmp = new TStringGrid[cn]; //cn -> integer
Vielen Dank
lg, freakC++
-
Hallo
TStringGrid *tmp = new (TStringGrid*)[cn]; //cn -> integer
Allerdings solltest du lieber DynamicArray oder besser noch std::vector verwenden, um dynamische Arrays abzubilden.
Die Verwendung von Zeigern ist ein grundlegender Zwang, hängt mit Gültigkeit und Ownership zusammen. Smartpointer würden das bestenfalls nur kapseln. Das Problem wirst du aber in allen Frameworks unter C/C++ haben.
bis bald
akari
-
freakC++ schrieb:
PS.: Warum muss im "VCL Stil" immer mit Pointern gearbeitet werden?
Das sowie viele andere Kleinigkeiten, die bei Delphi-Klassen in C++Builder beachtet werden müssen, steht hier. Speziell weshalb Delphi-Klassen nicht auf dem Stack alloziert werden können, habe ich im Abschnitt Allokation und Deallokation ausgeführt.
-
Hallo,
vielen Dank für eure Antworten. Das hat mir schon sehr geholfen. Dennoch funktioniert es noch nicht so, wie ich es haben möchte.Warum geht beispielsweise das hier nicht:
grid = new (TStringGrid*)[counter]; //counter ist im Konstruktor initialisiert grid[counter]->SetBounds(101*counter+10,180,101,379); //Wie greife ich auf ein solch ein Array zu?
Außerdem interessiert es mich zu wissen, warum die Deklaration so wie bei akari auszusehen hat. Kann mir das auch jemand sagen?
Ich danke euch.
lg, freakC++
-
mal davon abgesehen daß ein vector oder ähnliches besser wäre, wirds so gemacht:
int counter = 5; TStringGrid **grid = new TStringGrid*[counter]; //erzeugt das Feld for (int i=0; i<counter; i++) { grid[i] = new TStringGrid(this); // erzeugt das i. Element des Feldes grid[i]->Parent = this; grid[i]->Cells[1][1] = "Leer"; grid[i]->SetBounds(101*i+10,180,101,379); }
-
Hallo Linnea,
vielen Dank für deine Antwort. Ich habe noch eine andere Fragen an euch:1.) Wo ist dann der Unterschied zwischen folgenden Definitionen:
TStringGrid **grid = new TStringGrid*[counter]; //--------------------------------------------- TStringGrid *tmp = new (TStringGrid*)[counter];
2.) Wenn ich die untere Definition wähle, dann erbringt das hier einen Fehler:
TStringGrid *tmp = new (TStringGrid*)[counter]; for (int i = 0; i < counter-1; i++) { if (i == num) tmp[i] = grid[i+1]; //FEHLER --> Problem mit "=" Operator else tmp[i] = grid[i]; }
Fehler: Keine Übereinstimmung für 'TStringGrid::operator =(TStringGrid *)' gefunden
Warum erscheint die Fehlermeldung nicht, wenn ich die erste Definition wähle?
Vielen Dank
lg, freakC++
-
Weil die Erste richtig und die Zweite falsch ist. Du hast ja ein Array von Zeigern auf TStringGrid. Also Zeiger auf Zeiger.
-
Ok! Auch wenn die zweite Zeile falsch ist, würde mich interessieren, was sie macht. Immerhin kompiliert sie.
Vielen Dank
lg, freakC++