Initialisieren eines Arrays aus Objekten auf dem Stack



  • Hallo Leute,

    Ich möchte ein Array aus zwei BigInts direkt auf dem Stack initialieren.

    Ich habe in der Klasse folgenden Konstruktor definiert:

    explicit BigInt(unsigned int);
    

    Dazu habe ich folgendes versucht:

    BigInt bigInts[] = {1, 2};
    

    Leider schmeißt das einen Fehler.

    Fehler: Umwandlung von int in nicht-skalaren Typen BigInt angefordert
    

    Gehe ich richtig in der Annahme, dass der Compiler den int-Wert in eine Speicheradresse umwandeln möchte?

    Danach hab ich es etwas verändert nochmal mit folgendem probiert:

    BigInt bigInts[] = {BigInt(1), BigInt(2)};
    

    Leider verweigert mir der Compiler auch das mit einer Fehlermeldung.

    Fehler: keine passende Funktion für Aufruf von BigInt::BigInt(BigInt)
    

    Könnte mir bitte einer von euch erklären, wie man das richtig macht, bzw. ob das überhaupt möglich ist?

    Ach ja, folgendes geht natürlich auch, aber dabei wird ja einmal der default-Konstruktor und danach noch der Zuweisungsoperator aufgerufen, wobei ich ja letzteres verhindern möchte:

    BigInt bigInts[2];
    bigInts[0] = BigInt(1);
    bigInts[1] = BigInt(2);
    

    Eine kleine Verständnis-Frage hätte ich dazu auch noch:
    Wird, wenn ich ein Array erstelle, das Array immer im Heap angelegt und auf dem Stack nur ein Zeiger darauf oder kann man das Array auch wirklich auf dem Stack ablegen?



  • problemchild schrieb:

    Gehe ich richtig in der Annahme, dass der Compiler den int-Wert in eine Speicheradresse umwandeln möchte?

    nein. Der Compiler versucht eine implizite Konvertierung. Da dein Konstruktor aber "explicit" ist, darf er das nicht. Du könntest natürlich das "explicit" wegnehmen, aber vermutlich steht das nicht ohne Grund da...

    problemchild schrieb:

    Danach hab ich es etwas verändert nochmal mit folgendem probiert:

    BigInt bigInts[] = {BigInt(1), BigInt(2)};
    

    Leider verweigert mir der Compiler auch das mit einer Fehlermeldung.

    Fehler: keine passende Funktion für Aufruf von BigInt::BigInt(BigInt)
    

    Könnte mir bitte einer von euch erklären, wie man das richtig macht, bzw. ob das überhaupt möglich ist?

    Der Compiler findet keinen Kopierkonstruktor. Komisch, eigentlich wird dieser automatisch generiert. Hast du diesen explizit deaktiviert?

    Nur so nebenbei: Gibt es einen Grund, warum du ein array und keinen std::vector nimmst?



  • Danke für die schnelle Antwort daddy_felix.

    daddy_felix schrieb:

    Der Compiler findet keinen Kopierkonstruktor. Komisch, eigentlich wird dieser automatisch generiert. Hast du diesen explizit deaktiviert?

    Ich hab meinen Kopierkonstruktor auch als explicit definiert:

    explicit BigInt(BigInt const &);
    

    Wenn ich das explicit entferne, dann funktioniert die Variante mit dem "BigInt(1)".

    Was ich jetzt bloß nicht verstehe, ist warum ich das explicit vom Kopierkonstruktor entfernen muss, wenn er sowieso nicht aufgerufen wird.
    Nachdem ich das Programm jetzt laufen gelassen hab hat er nämlich (wie erwartet) nur den Konstruktor

    explicit BigInt(unsigned int);
    

    aufgerufen.

    Das explicit-Schlüsselwort benutze ich eigentlich, weil ich nicht möchte, dass der Compiler Umwandlungen macht, die ich u. U. nicht berücksichtigt hab.



  • Oh, und den vector nehm ich nicht her, weil ich genau weiß, dass ich nur diese beide Instanzen brauche (Speicherung der beiden vorherigen Zahlen in einer Fibonacci Folge).



  • problemchild schrieb:

    Was ich jetzt bloß nicht verstehe, ist warum ich das explicit vom Kopierkonstruktor entfernen muss, wenn er sowieso nicht aufgerufen wird.

    Weil er den heimlich weglassen darf. Aber zugänglich muss er trotzdem sein, deshalb meckert er.
    Übrigens, ein expliziter Copy-Ctor ist nicht gerade das gelbe vom Ei, die meisten Kopien werden nämlich implizit gemacht und können garnicht explizit erfolgen.

    Das explicit-Schlüsselwort benutze ich eigentlich, weil ich nicht möchte, dass der Compiler Umwandlungen macht, die ich u. U. nicht berücksichtigt hab.

    Ist auch meistens richtig so, allerdings ist der Copy-Ctor ja keine Umwandlung.


Anmelden zum Antworten