Frage zur Übergabe von Zeigern



  • Hallo,

    ich habe in meinen aktuellen Programm ein Problem:
    Und zwar würde ich gerne in einer Funktion eine map auf dem Heap erstellen und befüllen. Dann hätte ich gerne, dass die Funktion einen Zeiger auf die map zurückliefert.

    Welchen Datentyp muss die Funktion denn da bekommen?

    Vielen Dank für eure Hilfe 🙂



  • #include <map>
    #include <memory>
    #include <string>
    
    auto createMap()
    {
    	auto mptr = std::make_unique<std::map<int, std::string>>();
    
    	(*mptr)[0] = "Foo";
    	(*mptr)[1] = "Bar";
    
    	return mptr;
    }
    

    Deine Frage ist alles andere als genau, ich hab den Eindruck, du weist nicht wovon du sprichst, deshalb lasse ich den Code mal unkommentiert...



  • Ok, ich versuch mal es etwas genauer zu erklären:

    Um meine nicht so ganz guten C++ Kenntnisse zu verbessern, möchte ich gerne einen kleinen Vokabeltrainer basteln, um die Wichtigsten C++ Themen anzuwenden (verschiedene Quellcode Dateien, Dateiverwaltung, Container, Klassen...).
    Dafür habe ich eine Verwaltungsklasse erstellt, die zum Beispiel die Vokabeln aus einer Datei einlesen soll, dann in der map speichern und die map der Hauptklasse zur Verfügung stellen, so dass die sie dann zur Abfragefunktion weiterleiten kann.

    Ich glaube eigentlich schon deinen Quellcode zu verstehen, aber wenn ich versuche ihn zu compilieren bekomme ich diese 4 Fehlermeldungen: (Ich habe die Dateipfade immer durch *Pfad* ersetzt.

    Fehler 1 error C3551: Es wurde ein nachstehender Rückgabetyp erwartet. *Pfad* 8 1 ConsoleApplication2234

    Fehler 2 error C2440: 'return': 'std::unique_ptr<std::map<int,std::string,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>,std::default_delete<std::map<_Kty,_Ty,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>>>' kann nicht in 'int' konvertiert werden *Pfad* 14 1 ConsoleApplication2234

    Fehler 3 IntelliSense: Für die auto-Funktion ist ein nachstehender Rückgabetyp erforderlich. *Pfad* 7 1 ConsoleApplication2234

    Fehler 4 IntelliSense: Funktionen, die sich nur durch den Rückgabetyp unterscheiden, können nicht überladen werden. *Pfad* 7 6 ConsoleApplication2234

    Aber danke für deine Hilfe 🙂



  • Skymosho verwendet C++14's return type Erkennung.
    Ersetze das auto einfach durch std::unique_ptr<std::map<int, std::string>>.



  • Statt einem Zeiger kannst du auch das Objekt selber zurückgeben. Das ist heutzutage auch ähnlich schnell, aber wesentlich übersichtlicher, weil man auf die Objekte direkt zugreift, statt immer über Umwege.



  • Ah, danke Nathan, das funktioniert schon besser.
    Was muss ich denn dann da in die Deklaration schreiben? 😕

    @Marthog: Ich weiß aber ich würde gerne die Zeiger mal anwenden und wenigstens versuchen möglichst guten Code zu schreiben 🙂



  • Sicarius schrieb:

    @Marthog: Ich weiß aber ich würde gerne die Zeiger mal anwenden und wenigstens versuchen möglichst guten Code zu schreiben 🙂

    Guter Code besteht aber darin, die Objekte möglichst direkt anzusprechen, statt über pointer.
    Zeiger wendet man schon oft genug an, gerade wenn man mit Vererbung arbeitet und man sitzt eher daran, die Zeiger aus dem Code rauszubekommen.
    Wenn du es unbedingt aus Lernzwecken jetzt anwenden willst, schreib dir eine einfache Listen-klasse.



  • Und mein Code benutzt Zeiger. unique_ptr ist die kapselung eines Zeigers...



  • Aha, ok.
    Dann übergib ich sie einfach direkt.
    Danke für eure Hilfe 🙂


Log in to reply