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



  • Das h/cpp Problem wurde ja erörtert. Ich wollte nur noch anmerken, das ich dieses Design ziemlich unsinnig finde. Ich würde meine Champions nicht alle voneinander ableiten. Ich würde einem Champion einen Vektor mit Adressen von Eigenschaften geben, wobei diese Eigenschaften dann von einer gemeinsamen Basisklasse ableiten. In einer Konfigurationsdatei würde ich dann steuern welcher Champion welche Eigenschaft mit evtl. welchen Einstellungen hat. Einige Eigenschaften haben vlt. alle, z.B. Hitpoints oder Inventory, andere vlt. nicht wie Zaubern oder Schleichen.



  • Super danke, dass hat die ganzen String-Fehler behoben (:

    Ich bin echt noch nicht weit mit meinem Programm/Spiel allerdings bin ich schon auf etliche Fehler gestoßen die ich eigenständig lösen konnte. Aber manchmal sind es die einfachsten Dinge die ich nicht bemerke ...

    Naja zum letzten Fehler und gleichzeitig zu einer Frage:
    Unzwar meckert der Compiler nun die Klasse Champion der .cpp-Datei wurde bereits definiert und kann nicht wieder definiert werden, dass verstehe ich soweit auch. Ich bin mir nur nicht ganz sicher ob ich den Fehler richtig sehe. Das bedeutet ja das in der Header-Datei bereits die Klasse definiert wird und folglich müsste ich ja die Klasse dann in der .cpp-Datei löschen, damit die Klasse nicht 2 mal definiert wird. Ich weiß allerdings dass das nicht geht also stehe ich gerade wieder auf dem Schlauch. Ich weiß ich habe mir da ein etwas komplexes Projekt ausgesucht wobei ich erst vor 5 Monaten angefangen habe und circa 5std pro Woche nur programmieren kann, aber ich bin sehr verbissen was das angeht und hätte zumindest gerne eine kleine, unfertige Version, in der man wenigstens etwas machen kann außer sich einen Champion auszusuchen, bevor ich dann mein nächstes, dafür kleineres Projekt starte.

    Zu TGGC:
    Ich kenne mich noch nicht mit Vektoren aus aber ich werde dies im Hinterkopf behalten und mit der Zeit mal bearbeiten, danke für den Tipp (:



  • @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