[GELÖST] (Anfänger) ohne includierung Code implementieren?



  • @levyeme

    Ich weiß allerdings dass das nicht geht

    Aha. Warum?



  • Naja weil der Compiler dann nichts mit den private: und public: funktionen und variablen anzufangen weiss. Die genaue Fehlermeldung kann ich heute Abend nochmal reinschreiben 🙂



  • @levyeme Tipp: Wenn du so gefragt wirst, geht es wahrscheinlich doch, nur hast du es wohl falsch gemacht 😉



  • Das ist mir schon klar, aber ich dachte vielleicht erklärt es mir jemand 😃 Naja ich habe jetzt das Netz durchforstet und habe die Lösung gefunden. Danach stieß ich auf 3 weitere Fehler die ich behoben habe und nun komme ich wieder nicht weiter weil ich es echt nicht verstehe, vielleicht habt ihr einen Plan. Hier erstmal Test Nr.1 :

    else if(menueP == 2)
    			{
    				//Schattenwanderer wird erstellt
    				Schattenwanderer spieler;
    				spielerP = &spieler;
    				
    				cout<<"Name: "<<spielerP->getName()<<endl;
    				
    				choosed = true;
    			}
    

    Hier teste ich ob die Instanz vom Schattenwanderer an mein Champion-Objekt-Pointer spielerP übergeben wurde indem ich über spielerP die getName()-Funktion abrufe. Das funktioniert auch einwandfrei. So, 33 Zeilen weiter versuche ich die selbe Ausgabe:

    
    		}while(choosed == false);
    	}
    	//
    	//_________________
    	//CHAMPION AUSWAHL
    	//_________________
    	//
    	//
    	//_________________
    	//DAS MENUE
    	//_________________
    	//
    	
    	//Champion-Auswahl erzeugen
    	if(choosed == true)
    	{
    		do
    		{
    			cout<<"_______________________"<<endl;
    			cout<<"         MENUE  "<<endl;
    			cout<<"_______________________"<<endl;
    			cout<<"1 - Kampfzonen"<<endl;
    			cout<<"2 - Arena"<<endl;
    			cout<<"3 - Freier Kampf(Ohne EP)"<<endl;
    			cout<<"4 - Champion Infos"<<endl;
    			cout<<"5 - Beenden"<<endl;
    			
    			//-- Hier schmiert das Programm ab --//
    			cout<<"Name: "<<spielerP->getName()<<endl;
    			//-- 
    

    Wie ihr seht passiert dazwischen nicht großartig irgendetwas und trotzdem schmiert das Programm einfach ohne Fehlermeldung ab. Komischerweise ist das aber nur beim Schattenwanderer-Objekt so, der Schlaechter funktioniert, ist jedoch exakt gleich aufgebaut, nur mit anderem Namen:

    if(menueP == 1)
    			{
    				//Schlaechter wird erstellt
    				Schlaechter spieler;
    				spielerP = &spieler;
    				choosed = true;
    			
    			}
    

    Ja, mal sehen wann ich den Thread schließen kann haha, aber ich bin sehr dankbar das ihr versucht mir zu helfen (: schönen Abend noch an der Stelle.



  • Am Ende des if Blocks wird dein 'spieler' Objekt zerstört. Danach zeigt dein Zeiger irgendwo ins Nirvana und dein Programm kann nichts mehr damit anfangen.



  • Das wusste ich zwar aber mich wundert es dann das es troztdem mit dem Schlaechter-Objekt funktioniert hat aber das kannst du mir ja vielleicht noch erklären? Ich wäre dir sehr verbunden 😃

    Ich habe das Problem jetzt wie folgt gelöst indem ich die ganzen vorhandenen Champions erst deklariere:

    //VARIABLEN
    //
    		//Spieler Initialisieren
    		Champion *spielerP;
    		
    		//Champions initialisieren
    		Schattenwanderer schattenwanderer;
    		Schlaechter schlaechter;
    
    

    und sie dann im if-Block erst/nur die Zuweisung bekommen:

    if(menueP == 1)
    			{
    				//Schlaechter wird erstellt
    				spielerP = &schlaechter;
    				choosed = true;
    			
    			}
    			else if(menueP == 2)
    			{
    				//Schattenwanderer wird erstellt
    				spielerP = &schattenwanderer;
    				choosed = true;
    			}
    

    Ich danke vielmals für eure Hilfe und würde den Thread dann schließen (:



  • @levyeme sagte in [GELÖST] (Anfänger) ohne includierung Code implementieren?:

    choosed = true;

    Es heißt "chosen".

    Ich würd eher einen unique_ptr<> nehmen:

    #include <iostream>
    #include <memory>
    #include <limits>
    
    class Base {
    public:
    	virtual ~Base() {}
    	virtual void bark() = 0;
    };
    
    class A : public Base {
    public:
    	 void bark() override { std::cout << "Wau!\n"; }
    };
    
    class B : public Base {
    public:
    	void bark() override { std::cout << "Wuff!\n"; }
    };
    
    std::unique_ptr<Base> create_dog(int type)
    {
    	switch (type) {
    	case 1:
    		return std::make_unique<A>();
    	case 2:
    		return std::make_unique<B>();
    	}
    	return nullptr;
    }
    
    int main()
    {
    	int choice{};
    	while (choice != 1 && choice != 2) {
    		if (!(std::cin >> choice)) {
    			std::cin.clear();
    			std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    		}
    	}
    	
    	std::unique_ptr<Base> dog{ create_dog(choice) };
    	dog->bark();
    }
    

    dann liegt keine Schattenwanderer- bzw Schlaechterleiche rum, die nicht benötigt wird.



  • @levyeme Wenn das Objekt zerstört wird, heißt es nicht, dass im Speicher nur noch nullen oder so stehen, sondern da steht halt irgendwas. Daher kann sein, dass das zufällig funktioniert. Aber, dass ist halt Zufall.



  • @swordfish sagte in [GELÖST] (Anfänger) ohne includierung Code implementieren?:

    @levyeme sagte in [GELÖST] (Anfänger) ohne includierung Code implementieren?:

    choosed = true;

    Es heißt "choosen".

    Nö, "chosen" 😉



  • omg, ich geh heulen 😢 ... naja, zumindest war ich näher dran 😉



  • @Swordfish Will hier nicht rum klug scheißen, aber warum verpackst du dein switch Konstrukt nicht in eine saubere Factory Funktion? Du schmeißt hier einem offensichtlichen Anfänger gleich 2 "Fehler" vor die Füße. Dein std::unique_ptr<Base> dog; erstellst du viel zu früh. Würdest du das vll noch umändern, damit man direkt ein "richtiges" Beispiel hat?



  • passts jetzt? ^^



  • @swordfish sagte in [GELÖST] (Anfänger) ohne includierung Code implementieren?:

    std::unique_ptr<Base> dog{ create_dog(choice) };

    Warum nicht

    auto dog{ create_dog(choice) };
    

    ? 😛

    Aber jo, jetzt hat er was zum Lernen 😉



  • @dnkpp sagte in [GELÖST] (Anfänger) ohne includierung Code implementieren?:

    Warum nicht

    Du kannst mich mal gern haben.


Anmelden zum Antworten