Dynamische Objekte anlegen - Keine Ausgabe



  • Hey...
    Ist noch ziemlich ziemlich ungeordnet mein Code. Aber laufen tut er, doch er macht nciht was er soll! Ich möchte "Anzahl"-Viele objekte eingeben lassen und nach jedem durchlauf soll er den namen und das mhd vom eben eingegebenem ausgeben. Doch das macht er nicht...

    Wo ist mein Fehler?

    #include <iostream>
    #include <conio.h>
    #include <string>
    
    using namespace std;
    
    string *p;
    string eingabename;
    string eingabemhd;
    
    class vorrat
    {
    
    private:
    	string name;
    	string mhd;
    	int 
    		anzahl;
    
    public:
    	// KONSTRUKTOR//
    	vorrat::vorrat()
    	{
    	name = "Unt";
    	mhd = "21.12.1993";
    	int 
    		anzahl = 0;
    	}
    	// FUNKTIONEN //
    
    	void zeige()
    	{
    	cout<<"Name: "<<name<<endl;
    	cout<<"MHD: "<<mhd<<endl;
    	}
    
    	void neu()
    	{
    		int 
    			anzahl,
    			i;
    		cout<<"Anzahl neuer Produkte!"<<endl;
    		cin>>anzahl;
    		vorrat *p = new vorrat[anzahl];
    		for(i=0; i<anzahl; i++)
    		{
    
    			cout<<"Name: "<<endl;
    			cin>> eingabename;
    			p[i].name = eingabename;
    			cout<<"MHD: "<<endl;
    			cin>> eingabename;
    			p[i].name = eingabemhd;
    			cout<<p[i].name<<endl;
    			cout<<p[i].mhd<<endl;
    
    			cout<<"- - - - - - - - - - -"<<endl;
    		}
    	}
    };
    int main()
    {
    	vorrat produkt;
    	produkt.neu();
    
    getch();
    }
    


  • 9A-91 schrieb:

    vorrat *p = new vorrat[anzahl];

    Also da vermiss ich zunächst mal das dazugehörige delete []

    9A-91 schrieb:

    vorrat::vorrat()

    neee du, innerhalb der Klasse brauchst du den Scope nicht angeben.

    9A-91 schrieb:

    cin>> eingabename;
    p[i].name = eingabemhd;

    Da war Copy&Paste im Spiel 😉 ... da passt der Variablenname weder bei der Eingabe noch bei der Zuweisung (links)

    Das sollte erstmal für die eigentliche Funktion ausreichen.
    Der logische Hintergrund des Programms ist mir aber noch Schleierhaft 😃



  • WIe würdest du denn einen Vorratsschrank anlegen? 😃

    Also wo Produkte "drin" sind und "hinzugefügt" werden können. ?! Nicht so?^^



  • Ja klar ... und dann blamier ich mich mit meinem Code wieder bis auf die Knochen 😃
    Nagut ... als Ansatz und natürlich mit Optimierung nach oben.
    Bin selbst kein großer Freund von cout und cin innerhalb von Klassen, aber das kann ja jeder machen wie er will

    #include <iostream>
    #include <string>
    #include <vector>
    
    class Supply
    {
    	private:
    		struct Element
    		{
    			std::string name;
    			std::string mbh;
    
    			Element(const std::string &n, const std::string &m) : name(n), mbh(m)
    			{
    			}
    		};
    		std::vector<Element> elements;
    
    	public:
    		void addElement(const std::string &n, const std::string &m);
    		void printElements(std::ostream &os);
    };
    
    void Supply::addElement(const std::string &n, const std::string &m)
    {
    	Element newElement(n, m);
    	elements.push_back(newElement);
    }
    
    void Supply::printElements(std::ostream &os)
    {
    	typedef std::vector<Element>::iterator iter;
    
    	for(iter it=elements.begin(); it!=elements.end(); ++it)
    		os << "Name: " << it->name << "\tMHD: " << it->mbh << std::endl;
    }
    
    int main()
    {
    	Supply icebox;
    	int cnt;
    
    	std::cout << "Eingabe Anzahl" << std::endl;
    	std::cin >> cnt;
    	// TODO: Pruefung auf Zahl angebracht
    	for(int i=0; i<cnt; ++i)
    	{
    		std::string name;
    		std::string mhd;
    
    		std::cout << "Name:\t";
    		std::cin >> name;
    		std::cout << "MHD:\t";
    		std::cin >> mhd;
    
    		icebox.addElement(name, mhd);
    	}
    
    	icebox.printElements(std::cout);
    }
    


  • Und wie nennen sich die Prinzipien mit welchen du deinen Code aufgebaut hast?

    Weil ich möchte ja verstehen und kein Copy&Paste 😉



  • Ich kann mir unter "Prinzipien" grad nicht viel vorstellen.
    Aber wenn es darum geht, warum ich es so gemacht habe, wie ich es gemacht habe:

    - Die Klasse kapselt die Daten und die Benutzeraktionen finden außerhalb statt (Eingabe)
    - Ich kann jederzeit neue Elemente hinzufügen, ohne die alten zu überschreiben (Bei dir sind die Elemente pfutsch, wenn neu() durchflogen wurde.
    - Ich hab auf globale Variablen verzichtet
    - den vector der STL fand ich hier besser als mit new und delete herumzujonglieren.
    - sorgfältige Einrückungen !!! << ganz wichtig ... Code muss das Auge erfreuen 🤡
    - verwenden von Initialisierungslisten
    - und ich persönlich versuche, cin und cout in Klassen zu vermeiden. Warum, weiß ich aber nicht 😃 Bauchgefühl

    reicht das? ... andere wissen bestimmt auch noch coole Sachen 🕶



  • Hat es einen grun warumd u immer std:: vor allem möglichen schreibset?!?!? reicht nicht einfach using namespace std; ?



  • Der Namensraum hat ja den Grund Kollisionen mit anderen Namen zu vermeiden. Wenn du nun "using namespace ..." machst ist das ganze obsolet. Besser wäre da z.B. "using std::cout", also nur einzelne Elemente offenlegen. Vielen machen aber beides nicht (was durchaus nicht falsch ist) und deshalb muss überall der Namensraum mit angeben werden, da sonst die funktionen/etc... nicht gefunden werden.


Anmelden zum Antworten