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++


Anmelden zum Antworten