Anfänger findet fehler nicht
-
Skym0sh0 schrieb:
So, dein Fehler liegt in Zeile 8 der Klassendeklaration, sowie in Zeile 7 deiner main Datei und sie liegt eben nicht in deiner Bus.cpp.
im Gegenteil, der Fehler liegt sehr wohl in der Bus.cpp. Da fehlt nämlich der in Zeile 8 (Bus.h) deklarierte und in Zeile 7 (main.cpp) verwendete Konstruktor.
PS: ok, man könnte den Konstruktor auch inline schreiben. Dann wäre der Fehler in der Bus.h.
PPS: der copy-Konstruktor ist überflüssig. Der default copy-Konstruktor macht genau das schon, was du da hingeschrieben hast
-
Also ich habs jetzt erstmal wie folgt gelöst:
Zeile 5 wurde geändert...so funktioniert es schonmal.#include<iostream> #include "Bus.h" using namespace std; Bus::Bus(int, std::string, int, int, int) //Defaultkonstruktor { Buslinie=0; Fahrtziel= "nirgendwo"; Sitzplätze=40; Stehplätze=50; Passagiere=0; } Bus::~Bus() //Destruktor { cout<<"destruktor aktiviert"; } Bus::Bus(const Bus ©Bus) //Copykontruktor { Buslinie=copyBus.Buslinie; Fahrtziel=copyBus.Fahrtziel; Sitzplätze=copyBus.Sitzplätze; Stehplätze=copyBus.Stehplätze; Passagiere=copyBus.Passagiere; } void Bus::printmethode() { cout<<Buslinie<<endl<<Fahrtziel<<endl<<Sitzplätze<<endl<<Stehplätze<<endl<<Passagiere<<endl; }Aufgabe ist bis jetzt gewesen:
Defaultkonstruktor der den Bus mit Standardwerten initialisiert
• Destruktor (mit leerem Rumpf),
• Konstruktor zum Setzen der Member,
• Copykonstruktor,Danke schonmal für die Hilfe

-
daddy_felix schrieb:
Skym0sh0 schrieb:
So, dein Fehler liegt in Zeile 8 der Klassendeklaration, sowie in Zeile 7 deiner main Datei und sie liegt eben nicht in deiner Bus.cpp.
im Gegenteil, der Fehler liegt sehr wohl in der Bus.cpp. Da fehlt nämlich der in Zeile 8 (Bus.h) deklarierte und in Zeile 7 (main.cpp) verwendete Konstruktor.
PS: ok, man könnte den Konstruktor auch inline schreiben. Dann wäre der Fehler in der Bus.h.
Nein, du hast mich nicht verstanden. Daniel1990 deklariert neben dem Defaultconstructor noch einen speziellen Konstruktor, diesen definiert er aber nicht.
Meine Antwort zielte darauf, dass er diesen Specialconstructor deklariert, nutzt aber eben nicht implementiert ->
Skym0sh0 schrieb:
und sie liegt eben nicht in deiner Bus.cpp.
-
daddy_felix schrieb:
Skym0sh0 schrieb:
So, dein Fehler liegt in Zeile 8 der Klassendeklaration, sowie in Zeile 7 deiner main Datei und sie liegt eben nicht in deiner Bus.cpp.im Gegenteil, der Fehler liegt sehr wohl in der Bus.cpp. Da fehlt nämlich der in Zeile 8 (Bus.h) deklarierte und in Zeile 7 (main.cpp) verwendete Konstruktor.
PS: ok, man könnte den Konstruktor auch inline schreiben. Dann wäre der Fehler in der Bus.h.
Nein, du hast mich nicht verstanden. Daniel1990 deklariert neben dem Defaultconstructor noch einen speziellen Konstruktor, diesen definiert er aber nicht.
Meine Antwort zielte darauf, dass er diesen Specialconstructor deklariert, nutzt aber eben nicht implementiert -> Skym0sh0 schrieb:
und sie liegt eben nicht in deiner Bus.cpp.Also der Fehler liegt in diesen Zeilen:
Bus.h:
Bus(int, std::string, int, int, int);main.cpp:
Bus Bus1(1, "Baunatal", 10, 10, 5);wie sollte ich es deiner Meinung nach ändern? ich kann dir da gerade leider nicht Folgen sry
-
Ein Defaultconstructor ist ein Konstruktor(abgekürzt CTor), der keine Parameter annimmt.
class Bus { public: Bus(); // <-- Default CTor };Jeder andere Konstruktor nimmt Parameter (auch der Copy-CTor oder der Move-CTor).
Aber ein Objekt will ja richtig initialisiert werden, wenn es erzeugt ist und danach voll benutzbar sein. Daher kann es nötig sein, dass ein CTor auch Parameter nehmen kann/will/muss/darf/soll.
class Bus { public: Bus(); // <-- Default CTor Bus(int, std::string, int, int, int); // Anderer CTor };Soweit so gut. Lassen wir das Programm jetzt "laufen":
int main() { Bus b1; // Default konstruiert Bus b2(1, "Lol", 2, 3, 4); // anders konstruiert }Dann kompiliert das zwar ohne Probleme, aber bevor es startet, merkt der Linker "Ups da stimmt was nicht". Denn was machen die beiden Konstruktoren? Man weiss es nicht. Der Computer will das im Allgemeinen jedoch wissen, also sagen wirs ihm:
Bus::Bus() { }// hier passiert zwar nix, aber es reicht Bus::Bus(int, std::string, int, int, int) { } // hier passiert zwar nix, aber es reichtHier haben wir die beiden deklarierten Methoden (eben die beiden CTors) auch definiert bzw. implementiert )Obwohl da nichts passiert, das ist deine Aufgabe).
Dein Fehler war, dass der zweite Konstruktor (der mit den Parametern) eben nirgends definiert und implementiert war.
-
Überleg mal, du hast einen Deklaration und einen Aufruf. Was fehlt?
Tipp: Mit deiner letzten Änderung hast du das fehlende (wenn auch im Sinne der Funktion falsch) implementiert.
-
So ich habe das Programm nochmal "neu" geschrieben, so müsste es im Großen und Ganzen passen, allerdings hab ich in der Ausgabe jetzt ein Problem ... und zwar gibt er nicht wie vorher die Zahlen und buchstaben aus wie eingegeben sondern sowas hier -854862
Klasse:
#include <iostream> using namespace std; #include <string> class Bus { public: Bus(); Bus(int, std::string, int, int, int); Bus(const Bus &CopyBus); void printmethode(); ~Bus(); private: int Buslinie; std::string Ziel; int Sitzplätze; int Stehplätze; int Passagiere; };Klasse.cpp
#include <iostream> #include "Bus.h" using namespace std; Bus::Bus(){} Bus::Bus(int Buslinie, std::string Ziel, int Sitzplätze, int Stehplätze, int Passagiere) // Defaultkonstruktor { Buslinie=0; Ziel= "nirgendwo"; Sitzplätze=40; Stehplätze=50; Passagiere=0; } Bus::Bus(const Bus &CopyBus) //Copykonstruktor { Buslinie=CopyBus.Buslinie; Ziel=CopyBus.Ziel; Sitzplätze=CopyBus.Sitzplätze; Stehplätze=CopyBus.Stehplätze; Passagiere=CopyBus.Passagiere; } void Bus::printmethode() {cout<<Buslinie<<endl<<Ziel<<endl<<Sitzplätze<<endl<<Stehplätze<<endl<<Passagiere<<endl;} Bus::~Bus() //Destruktor { cout<<"Destruktor"<<endl; }MAin:
#include "Bus.h" #include <iostream> using namespace std; int main() { Bus Fernbus; Bus Fernbus2(1, "Weitweg", 100, 50, 150); Fernbus.printmethode(); Fernbus2.printmethode(); system("pause"); return 0; }
-
Du müsstest die Integer im Default Constructor auch initialisieren.
-
*nochmal genauer hinkuck*
btw, Zeile 7 in der Klasse.cpp lese ich
// Defaultkonstruktor.
Das ist er aber nicht.
-
Genau, Zeile 6 ist der Defaultkonstruktur.
-
ist das nicht schon mit namespace initialisiert?
-
Daniel1990 schrieb:
ist das nicht schon mit namespace initialisiert?
Das grenzt an Trolling oO
Falls nicht, nein ist es nicht. Namespaces sind was ganz anderes und die machen auch was ganz anderes.
-
Ja sorry wenn ichs nicht Checke
wenn ichs wüsste, würde ich ja nicht fragen...
-
Skym0sh0 schrieb:
Daniel1990 schrieb:
ist das nicht schon mit namespace initialisiert?
Das grenzt an Trolling oO
Nein, nicht ganz.
@TE: Nur globale Variablen, sowie Variablen in einem Namensraum und (afaik) statische Variablen werden seit C++11 default-initialisiert (ohne es explizit dahin zu kritzeln). Deine Integer jedoch sind Member einer Klasse und haben mit einem Namensraum recht wenig am Hut.
-
Also ich soll in klasse.cpp, im defaultkonstruktor ... der über dem, den ich bisher als defaultkonstruktor angesehen habe... die Integer initialisieren, soweit, so gut. Wenn mir jetzt noch jemand ein Beispiel oder so dazu geben könnte? ich bekomme nämlich nur fehler raus

-
Daniel1990 schrieb:
Wenn mir jetzt noch jemand ein Beispiel oder so dazu geben könnte?
Nö.
Poste mal den Code des Default Constructors.
-
Ich hab jetzt mehrere Sachen geändert:
in der Klasse selbst einmal:class Bus { public: Bus(); Bus(int buslinie, std::string ziel, int sitzplätze, int stehplätze, int passagiere); Bus(const Bus &CopyBus); void printmethode(); ~Bus(); private: int Buslinie; std::string Ziel; int Sitzplätze; int Stehplätze; int Passagiere; };und in der Bus.cpp
Bus::Bus() // Defaultkonstruktor { Buslinie=0; Ziel= "nirgendwo"; Sitzplätze=40; Stehplätze=50; Passagiere=0; } Bus::Bus(int buslinie, std::string ziel, int sitzplätze, int stehplätze, int passagiere) { Buslinie=buslinie; Ziel= ziel; Sitzplätze=sitzplätze; Stehplätze=stehplätze; Passagiere=passagiere; }
-
Also war ja mein Konstruktor schon der defaultkonstruktor, da er ja keine Parameter erwartet hat. Nur der darüber war einfach Falsch ... und ich habe angenommen das der Konstruktor, der die Parameter erwartet der defaultkonstruktor ist ... oder sowas in der Art ...
-
Als nächstes könntest du mal googlen, was eine "Initialisierungsliste" ist.
-
lösch deinen kopierkonstruktor raus, dann:
1. ist dreierregel nicht mehr verletzt
2. ist das programm schneller (init statt init & assign)
3. sparst du codezeilen und gewährst mehr leserlichkeit