Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [c++] Durch Objektliste iterieren (https://www.delphipraxis.net/120543-%5Bc-%5D-durch-objektliste-iterieren.html)

Luckie 12. Sep 2008 11:41


[c++] Durch Objektliste iterieren
 
Folgendes Problem. Ich habe Objekte, die in einer Liste verwaltet werden:
Code:
#pragma once

#include <iostream>
#include <list>

#include "Konto.h"

using namespace std;

class CKunde
{
private: string _name;
private: string _vorname;
private: list<CKonto> _konten;

public: CKunde(void);
public: ~CKunde(void);

public: string GetName();
public: void SetName(string Name);
public: string GetVorname();
public: void SetVorname(string Vorname);
public: list<CKonto> GetKonten();
public: void AddKonto(CKonto* Konto);
};
Jetzt will ich durch die Liste iteriren:
Code:
   list<CKunde>::iterator iterKunden;
   for(iterKunden = _kunden.begin(); iterKunden != _kunden.end(); ++iterKunden)
   {
      cout << iterKunden->GetName().c_str() << ", " << iterKunden->GetVorname().c_str() << endl;
      list<CKonto>::iterator iterKonten;
      for(iterKonten = iterKunden->GetKonten().begin(); iterKonten != iterKunden->GetKonten().end(); ++iterKonten)
      {
         cout << iterKonten->GetBeschreibung().c_str() << endl;
         cout << iterKonten->GetSaldo() << endl;
      }
      cout << endl;
   }
Bei der inneren for-Schleife bekomme ich aber zur Laufzeit folgende Fehlermeldung:
Zitat:

Expression: list iterators incompatible
Aber warum, was mache ich da falsch?

[edit=SirThornberry]Titel korrigiert - Mfg, SirThornberry[/edit]

freak4fun 12. Sep 2008 11:49

Re: [c++] Durch Objektliste interieren
 
Müsste es Kunden statt Konten heißen? :gruebel: Da Konten die Laufvariable ist.
Code:
cout << iterKunden->GetBeschreibung().c_str() << endl;
cout << iterKunden->GetSaldo() << endl;

Luckie 12. Sep 2008 12:00

Re: [c++] Durch Objektliste interieren
 
Nein jeder Kunde kann mehrere Konten haben.

Roachford 12. Sep 2008 13:48

Re: [c++] Durch Objektliste interieren
 
Findest du das wirklich gut, die Deklarationen im Header jede Zeile neu mit dem Modifier zu beginnen? Da ziehe ich lieber nur einen Modifier für einen Block vor.

Und zu deinem Problem: Deine GetKonten() Methode gibt eine Kopie der std::list<> zurück und damit erhälst du innerhalb der Schleife zwei unterschiedliche Listen. Damit kann die For Schleife nicht arbeiten, da der begin() iterator zu einer anderen Liste gehört als der end() iterator.

Luckie 12. Sep 2008 14:02

Re: [c++] Durch Objektliste interieren
 
Zitat:

Zitat von Roachford
Findest du das wirklich gut, die Deklarationen im Header jede Zeile neu mit dem Modifier zu beginnen? Da ziehe ich lieber nur einen Modifier für einen Block vor.

In C++ habe ich nur Grundkenntnisse und noch nicht all zuviel mit gemacht. In den Beispiel habe ich es so gefunden.

Zitat:

Und zu deinem Problem: Deine GetKonten() Methode gibt eine Kopie der std::list<> zurück und damit erhälst du innerhalb der Schleife zwei unterschiedliche Listen. Damit kann die For Schleife nicht arbeiten, da der begin() iterator zu einer anderen Liste gehört als der end() iterator.
Das heißt, was müsste ich ändern?

DMW 13. Sep 2008 18:56

Re: [c++] Durch Objektliste interieren
 
Zitat:

Zitat von Luckie
[c++] Durch Objektliste interieren

Zitat:

Zitat von Luckie
Jetzt will ich durch die Liste iteriren:

Bei der Schreibweise von "iterieren" scheinst du dir ja nicht allzu sicher gewesen zu sein ;)


Daß du überhaupt eine Fehlermeldung bekommst, liegt wohl daran, daß das Iterator-Debugging aktiviert ist.
Wie Roachford erklärte, gibt GetKonten() eine Kopie deines Listenobjektes zurück; du möchtest wohl eher, wie in Delphi üblich, eine Referenz zurückgeben.
Code:
class CKunde

public:
...
   const list <CKonto>& GetKonten ()
   { return _konten; }
Allerdings solltest du dir bewußt sein, daß du damit ein Implementationsdetail ins Interface verschiebst; wenn du dich später für einen vector oder einen nicht in der STL enthaltenen Container entscheidest, mußt du das Interface ändern.

Noch drei weitere Anmerkungen:
  • "using namespace"-Deklarationen haben in Headerdateien nichts zu suchen.
  • In C++ ist es unüblich, Zeiger auf Objekte zu übergeben. Das liegt einerseits daran, daß ein Zeigerparameter gewöhnlich impliziert, daß man auch 0 übergeben könne, und damit wird - und sollte - deine AddKonto()-Funktion sicherlich nicht rechnen. Zudem sind bei Objektzeigern die Besitzverhältnisse unklar: soll AddKonto() eine Kopie des übergebenen Objektes erstellen, oder soll es das Objekt selbst in Besitz nehmen und bei Bedarf freigeben? Dies würde wiederum erfordern, daß das Objekt mit new angelegt würde, und dann hast du beim Übergeben als Zeiger ein potentielles Speicherleck (falls eine Exception auftritt).
    Typischerweise würde AddKonto() eine konstante Referenz übernehmen:
    Code:
    void AddKonto (const CKonto& konto);
    Das ist effizienter als eine Kopie des Objektes, und zudem ermöglicht es, daß der Parameter on-the-fly als temporäres Objekt konstruiert wird:
    Code:
    AddKonto (CKonto (<hier die Parameter für den Konstruktor von CKonto angeben>));
    Wenn du aber ein Äquivalent zu der Objektreferenz von Delphi möchtest, beispielsweise, weil CKonto nicht über eine Kopiersemantik verfügt, dann solltest du eher einen referenzzählenden Smart-Pointer übergeben.
  • Für C++-spezifische Fragen kann ich dir http://www.c-plusplus.de/forum/ empfehlen. Du kennst das Forum ja ;)

Luckie 13. Sep 2008 19:25

Re: [c++] Durch Objektliste interieren
 
Danke für deine Hilfe. Irgendwie komme ich nicht so ganz klar damit. Ich bekomme jetzt Syntaxfehler ohne Ende. Mein Quellcode:
Code:
#pragma once

#include <iostream>
#include <list>

#include "Konto.h"

class CKunde
{
private:
   string _name;
   string _vorname;
   list<CKonto> _konten;

   CKunde(void);
   ~CKunde(void);

public:
   string GetName();
   void SetName(string Name);
   string GetVorname();
   void SetVorname(string Vorname);
   list<CKonto> GetKonten();
   void AddKonto(CKonto* Konto);
};
Code:
#pragma once

#include <iostream>

class CKonto
{
private:
   string _beschreibung;
   int _saldo;

public:
   CKonto(void);
   ~CKonto(void);

   string GetBeschreibung();
   void SetBeschreibung(string Beschreibung);

   int GetSaldo();
   void SetSaldo(int Saldo);
};
Code:
// Bank.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "kunde.h"
#include <iterator>

using namespace std

int _tmain(int argc, _TCHAR* argv[])
{

   list<CKunde>_kunden;
   
   // class CKunde kunde1();

   CKunde* kunde1 = new CKunde();
   kunde1->SetName("Mueller");
   kunde1->SetVorname("Emil");
   CKonto* konto1 = new CKonto();
   konto1->SetBeschreibung("Privatkonto");
   konto1->SetSaldo(500);
   kunde1->AddKonto(konto1);
   CKonto* konto2 = new CKonto();
   konto2->SetBeschreibung("Firmenkonto");
   konto2->SetSaldo(1000);
   _kunden.push_back(*kunde1);
   
   list<CKunde>::iterator iterKunden;
   for(iterKunden = _kunden.begin(); iterKunden != _kunden.end(); ++iterKunden)
   {
      cout << iterKunden->GetName().c_str() << ", " << iterKunden->GetVorname().c_str() << endl;
      list<CKonto>::iterator iterKonten;
      for(iterKonten = iterKunden->GetKonten().begin(); iterKonten != iterKunden->GetKonten().end(); ++iterKonten)
      {
         cout << iterKonten->GetBeschreibung().c_str() << endl;
         cout << iterKonten->GetSaldo() << endl;
      }
      cout << endl;
   }

   return 0;
}
Und die Ausgabe des Compilers:
Code:
------ Erstellen gestartet: Projekt: Bank, Konfiguration: Debug Win32 ------
Compiling...
Bank.cpp
e:\c\programme\bank\konto.h(8) : error C2146: syntax error : missing ';' before identifier '_beschreibung'
e:\c\programme\bank\konto.h(8) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\konto.h(8) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\konto.h(15) : error C2146: syntax error : missing ';' before identifier 'GetBeschreibung'
e:\c\programme\bank\konto.h(15) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\konto.h(15) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\konto.h(15) : warning C4183: 'GetBeschreibung': missing return type; assumed to be a member function returning 'int'
e:\c\programme\bank\konto.h(16) : error C2061: syntax error : identifier 'string'
e:\c\programme\bank\kunde.h(11) : error C2146: syntax error : missing ';' before identifier '_name'
e:\c\programme\bank\kunde.h(11) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.h(11) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.h(12) : error C2146: syntax error : missing ';' before identifier '_vorname'
e:\c\programme\bank\kunde.h(12) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.h(12) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.h(13) : error C2143: syntax error : missing ';' before '<'
e:\c\programme\bank\kunde.h(13) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.h(13) : error C2238: unexpected token(s) preceding ';'
e:\c\programme\bank\kunde.h(19) : error C2146: syntax error : missing ';' before identifier 'GetName'
e:\c\programme\bank\kunde.h(19) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.h(19) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.h(19) : warning C4183: 'GetName': missing return type; assumed to be a member function returning 'int'
e:\c\programme\bank\kunde.h(20) : error C2061: syntax error : identifier 'string'
e:\c\programme\bank\kunde.h(21) : error C2146: syntax error : missing ';' before identifier 'GetVorname'
e:\c\programme\bank\kunde.h(21) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.h(21) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.h(21) : warning C4183: 'GetVorname': missing return type; assumed to be a member function returning 'int'
e:\c\programme\bank\kunde.h(22) : error C2061: syntax error : identifier 'string'
e:\c\programme\bank\kunde.h(23) : error C2143: syntax error : missing ';' before '<'
e:\c\programme\bank\kunde.h(23) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.h(23) : error C2238: unexpected token(s) preceding ';'
e:\c\programme\bank\bank.cpp(10) : error C2144: syntax error : 'int' should be preceded by ';'
e:\c\programme\bank\bank.cpp(17) : error C2248: 'CKunde::CKunde' : cannot access private member declared in class 'CKunde'
        e:\c\programme\bank\kunde.h(15) : see declaration of 'CKunde::CKunde'
        e:\c\programme\bank\kunde.h(9) : see declaration of 'CKunde'
e:\c\programme\bank\bank.cpp(18) : error C2660: 'CKunde::SetName' : function does not take 1 arguments
e:\c\programme\bank\bank.cpp(19) : error C2660: 'CKunde::SetVorname' : function does not take 1 arguments
e:\c\programme\bank\bank.cpp(21) : error C2660: 'CKonto::SetBeschreibung' : function does not take 1 arguments
e:\c\programme\bank\bank.cpp(25) : error C2660: 'CKonto::SetBeschreibung' : function does not take 1 arguments
e:\c\programme\bank\bank.cpp(32) : error C2228: left of '.c_str' must have class/struct/union
        type is 'int'
e:\c\programme\bank\bank.cpp(32) : error C2228: left of '.c_str' must have class/struct/union
        type is 'int'
e:\c\programme\bank\bank.cpp(34) : error C2039: 'GetKonten' : is not a member of 'CKunde'
        e:\c\programme\bank\kunde.h(9) : see declaration of 'CKunde'
e:\c\programme\bank\bank.cpp(34) : error C2228: left of '.begin' must have class/struct/union
e:\c\programme\bank\bank.cpp(34) : error C2039: 'GetKonten' : is not a member of 'CKunde'
        e:\c\programme\bank\kunde.h(9) : see declaration of 'CKunde'
e:\c\programme\bank\bank.cpp(34) : error C2228: left of '.end' must have class/struct/union
e:\c\programme\bank\bank.cpp(36) : error C2228: left of '.c_str' must have class/struct/union
        type is 'int'
Konto.cpp
e:\c\programme\bank\konto.h(8) : error C2146: syntax error : missing ';' before identifier '_beschreibung'
e:\c\programme\bank\konto.h(8) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\konto.h(8) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\konto.h(15) : error C2146: syntax error : missing ';' before identifier 'GetBeschreibung'
e:\c\programme\bank\konto.h(15) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\konto.h(15) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\konto.h(15) : warning C4183: 'GetBeschreibung': missing return type; assumed to be a member function returning 'int'
e:\c\programme\bank\konto.h(16) : error C2061: syntax error : identifier 'string'
e:\c\programme\bank\konto.cpp(16) : error C2556: 'std::string CKonto::GetBeschreibung(void)' : overloaded function differs only by return type from 'int CKonto::GetBeschreibung(void)'
        e:\c\programme\bank\konto.h(15) : see declaration of 'CKonto::GetBeschreibung'
e:\c\programme\bank\konto.cpp(16) : error C2371: 'CKonto::GetBeschreibung' : redefinition; different basic types
        e:\c\programme\bank\konto.h(15) : see declaration of 'CKonto::GetBeschreibung'
e:\c\programme\bank\konto.cpp(17) : error C2065: '_beschreibung' : undeclared identifier
e:\c\programme\bank\konto.cpp(21) : error C2511: 'void CKonto::SetBeschreibung(std::string)' : overloaded member function not found in 'CKonto'
        e:\c\programme\bank\konto.h(6) : see declaration of 'CKonto'
Kunde.cpp
e:\c\programme\bank\konto.h(8) : error C2146: syntax error : missing ';' before identifier '_beschreibung'
e:\c\programme\bank\konto.h(8) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\konto.h(8) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\konto.h(15) : error C2146: syntax error : missing ';' before identifier 'GetBeschreibung'
e:\c\programme\bank\konto.h(15) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\konto.h(15) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\konto.h(15) : warning C4183: 'GetBeschreibung': missing return type; assumed to be a member function returning 'int'
e:\c\programme\bank\konto.h(16) : error C2061: syntax error : identifier 'string'
e:\c\programme\bank\kunde.h(11) : error C2146: syntax error : missing ';' before identifier '_name'
e:\c\programme\bank\kunde.h(11) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.h(11) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.h(12) : error C2146: syntax error : missing ';' before identifier '_vorname'
e:\c\programme\bank\kunde.h(12) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.h(12) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.h(13) : error C2143: syntax error : missing ';' before '<'
e:\c\programme\bank\kunde.h(13) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.h(13) : error C2238: unexpected token(s) preceding ';'
e:\c\programme\bank\kunde.h(19) : error C2146: syntax error : missing ';' before identifier 'GetName'
e:\c\programme\bank\kunde.h(19) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.h(19) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.h(19) : warning C4183: 'GetName': missing return type; assumed to be a member function returning 'int'
e:\c\programme\bank\kunde.h(20) : error C2061: syntax error : identifier 'string'
e:\c\programme\bank\kunde.h(21) : error C2146: syntax error : missing ';' before identifier 'GetVorname'
e:\c\programme\bank\kunde.h(21) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.h(21) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.h(21) : warning C4183: 'GetVorname': missing return type; assumed to be a member function returning 'int'
e:\c\programme\bank\kunde.h(22) : error C2061: syntax error : identifier 'string'
e:\c\programme\bank\kunde.h(23) : error C2143: syntax error : missing ';' before '<'
e:\c\programme\bank\kunde.h(23) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.h(23) : error C2238: unexpected token(s) preceding ';'
e:\c\programme\bank\kunde.cpp(14) : error C2143: syntax error : missing ';' before 'CKunde::GetName'
e:\c\programme\bank\kunde.cpp(14) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.cpp(15) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.cpp(16) : error C2065: '_name' : undeclared identifier
e:\c\programme\bank\kunde.cpp(19) : error C2146: syntax error : missing ')' before identifier 'Name'
e:\c\programme\bank\kunde.cpp(19) : error C2761: 'void CKunde::SetName(void)' : member function redeclaration not allowed
e:\c\programme\bank\kunde.cpp(19) : error C2059: syntax error : ')'
e:\c\programme\bank\kunde.cpp(20) : error C2143: syntax error : missing ';' before '{'
e:\c\programme\bank\kunde.cpp(20) : error C2447: '{' : missing function header (old-style formal list?)
e:\c\programme\bank\kunde.cpp(24) : error C2143: syntax error : missing ';' before 'CKunde::GetVorname'
e:\c\programme\bank\kunde.cpp(24) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.cpp(24) : error C2086: 'int string' : redefinition
        e:\c\programme\bank\kunde.cpp(14) : see declaration of 'string'
e:\c\programme\bank\kunde.cpp(25) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.cpp(26) : error C2065: '_vorname' : undeclared identifier
e:\c\programme\bank\kunde.cpp(29) : error C2146: syntax error : missing ')' before identifier 'Vorname'
e:\c\programme\bank\kunde.cpp(29) : error C2761: 'void CKunde::SetVorname(void)' : member function redeclaration not allowed
e:\c\programme\bank\kunde.cpp(29) : error C2059: syntax error : ')'
e:\c\programme\bank\kunde.cpp(30) : error C2143: syntax error : missing ';' before '{'
e:\c\programme\bank\kunde.cpp(30) : error C2447: '{' : missing function header (old-style formal list?)
e:\c\programme\bank\kunde.cpp(34) : error C2143: syntax error : missing ';' before '<'
e:\c\programme\bank\kunde.cpp(34) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\c\programme\bank\kunde.cpp(34) : error C2039: 'GetKonten' : is not a member of 'CKunde'
        e:\c\programme\bank\kunde.h(9) : see declaration of 'CKunde'
e:\c\programme\bank\kunde.cpp(35) : error C2143: syntax error : missing ';' before '{'
e:\c\programme\bank\kunde.cpp(35) : error C2447: '{' : missing function header (old-style formal list?)
e:\c\programme\bank\kunde.cpp(41) : error C2065: '_konten' : undeclared identifier
e:\c\programme\bank\kunde.cpp(41) : error C2228: left of '.push_back' must have class/struct/union
        type is ''unknown-type''
Generating Code...
Build log was saved at "file://e:\C\Programme\Bank\Debug\BuildLog.htm"
Bank - 104 error(s), 7 warning(s)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
Ich bin mir ziemlich sicher, dass da viele Folgefehler enthalten sind. Ausserdem erstellt mir das VS lauter Ordner im Projektverzeichnis wie *.pdb. Was sind das für Ordner und kann man das nicht irgendwie vermeiden? Das kenne ich bisher so nicht vom VC 6.0.

DMW 13. Sep 2008 19:41

Re: [c++] Durch Objektliste interieren
 
Wenn du kein "using namespace" im Header hast, mußt du die Liste im Header natürlich auch vollständig qualifizieren, also als std::list. Und GetKonten() gibt immer noch eine Kopie und keine Referenz zurück.

Überdies erzeugst du in _tmain() diverse Speicherlecks. Eigentlich müßte dir aus Delphi bekannt sein, warum. Oder schreibst du da Code wie
Delphi-Quellcode:
var
  kunde1: TKunde;
  konto1: TKonto;

begin
  kunde1 := TKunde.Create;
  kunde1.Name := 'Mueller';
  kunde1.Vorname := 'Emil';
  konto1 := TKonto.Create;
  konto1.Saldo := 500;
  kunde1.AddKonto (konto1);
?

Luckie 13. Sep 2008 19:49

Re: [c++] Durch Objektliste interieren
 
Zitat:

Zitat von DMW
Wenn du kein "using namespace" im Header hast, mußt du die Liste im Header natürlich auch vollständig qualifizieren, also als std::list. Und GetKonten() gibt immer noch eine Kopie und keine Referenz zurück.

Ich weiß. Ich woööte erstmal die Kompilerfehler weg haben.

Zitat:

Überdies erzeugst du in _tmain() diverse Speicherlecks. Eigentlich müßte dir aus Delphi bekannt sein, warum. Oder schreibst du da Code wie
Delphi-Quellcode:
var
  kunde1: TKunde;
  konto1: TKonto;

begin
  kunde1 := TKunde.Create;
  kunde1.Name := 'Mueller';
  kunde1.Vorname := 'Emil';
  konto1 := TKonto.Create;
  konto1.Saldo := 500;
  kunde1.AddKonto (konto1);
?
Ich weiß, ich muss den Speicher noch freigeben, aber so weit war ich noch gar nicht. ;)

So Compilerfehler sind weg, jetzt kann ich mich um den Rest kümmern.

Kannst du mir noch was zu den Ordnern sagen?

DMW 13. Sep 2008 19:56

Re: [c++] Durch Objektliste interieren
 
Zitat:

Zitat von Luckie
Ich weiß, ich muss den Speicher noch freigeben, aber so weit war ich noch gar nicht. ;)

Nicht nur das. Was passiert denn, wenn jemand, z.B. in TKonto.Create respektive CKonto::CKonto(), eine Exception wirft? ;)


Zitat:

Zitat von Luckie
Kannst du mir noch was zu den Ordnern sagen?

.pdb-Dateien enthalten üblicherweise Debug-Informationen, ähnlich wie die .tds-Dateien beim C++Builder. Warum VS in deinem Projektverzeichnis aber irgendwelche Ordner erstellt, weiß ich nicht; ich bin eher C++Builder-Benutzer.

Luckie 13. Sep 2008 21:04

Re: [c++] Durch Objektliste interieren
 
So die Änderungen habe ich jetzt gemacht. Jetzt bekomme ich natürlich im Hauptprogramm Fehler. Code ist bisher unverändert, siehe oben.
Code:
e:\c\programme\bank\bank.cpp(34) : error C2228: left of '.begin' must have class/struct/union
        type is ''unknown-type''
e:\c\programme\bank\bank.cpp(34) : error C3861: 'GetKonten': identifier not found
Kunde.cpp
e:\c\programme\bank\kunde.cpp(35) : error C2556: 'const std::list<_Ty> &CKunde::GetKonten(void)' : overloaded function differs only by return type from 'const std::list<_Ty> CKunde::GetKonten(void)'
        with
        [
            _Ty=CKonto
        ]
        e:\c\programme\bank\kunde.h(22) : see declaration of 'CKunde::GetKonten'
e:\c\programme\bank\kunde.cpp(35) : error C2373: 'CKunde::GetKonten' : redefinition; different type modifiers
        e:\c\programme\bank\kunde.h(22) : see declaration of 'CKunde::GetKonten'
Ohm Mann, irgendwie ist das doch ziemlich mühsam mit C++, wenn man keinen Plan hat. Wir machen gerade in der Schule Java und unser lehrer hatte die Idee, damit wir auch was von anderen Sprachen mitbekommen, dass jeder das Programm noch mal in einer Sprache seiner Wahl schreibt. Ich habe C++ genommen, weil wir keinen Delphi Compiler in der Schule haben.

Gut Try-Catch-Blöcke kommen dann noch rein. Ich würde da gerne selber eine Exception werfen wie in Delphi:
Delphi-Quellcode:
except
  on E: ESonstwas do
    raise E.Message;
end;
Aber wie geben ich die Konten wieder frei im Destruktor von CKunde? Da war irgendwas mit delete []. Aber einen geneauen Plan habe ich da im Moment noch nicht.

Wäre nett, wenn ihr mir da noch weiterhelfen könntet.

DMW 14. Sep 2008 18:37

Re: [c++] Durch Objektliste interieren
 
Zitat:

Zitat von Luckie
Wir machen gerade in der Schule Java und unser lehrer hatte die Idee, damit wir auch was von anderen Sprachen mitbekommen, dass jeder das Programm noch mal in einer Sprache seiner Wahl schreibt. Ich habe C++ genommen, weil wir keinen Delphi Compiler in der Schule haben.

??
Zitat:

Zitat von Profil von Luckie
Luckie
Moderator
Alter: 34

Mißverstehe ich da irgendetwas?


Zitat:

Zitat von Luckie
Aber wie geben ich die Konten wieder frei im Destruktor von CKunde?

Gar nicht. Deine Liste speichert Objekte, keine Objektreferenzen. Das Aufräumen übernimmt die Liste.

Luckie 14. Sep 2008 19:09

Re: [c++] Durch Objektliste iterieren
 
Ok, dann muss ich nur die Kunden wieder freigeben. Aber das geht auch irgendwie mit delete[] oder?

Und der Rest hat schon seine Richtigkeit. Es ist die Berufsschule. ;)

Roachford 14. Sep 2008 22:07

Re: [c++] Durch Objektliste iterieren
 
Code:
delete []
wenn es ein Array ist, ein Objekt mit
Code:
delete Objektzeiger
.

Also in deinem Falle
Code:
delete kunde1, konto1, konto2;
Aso und meine Anmerkung mit dem Modifiern meinte ich so:

Code:
class CKunde
{
private:
  std::string _name;
  std::string _vorname;
  std::list<CKonto> _konten;

public:
  CKunde(void);
  ~CKunde(void);

  std::string GetName(void);
  void SetName(std::string Name);
  std::string GetVorname(void);
  void SetVorname(std::string Vorname);
  std::list<CKonto>& GetKonten();
  void AddKonto(CKonto& Konto);
};

Luckie 14. Sep 2008 22:23

Re: [c++] Durch Objektliste iterieren
 
Zitat:

Zitat von Roachford
Code:
delete []
wenn es ein Array ist, ein Objekt mit
Code:
delete Objektzeiger
.

Also in deinem Falle
Code:
delete kunde1, konto1, konto2;

Ah, danke.

Zitat:

Aso und meine Anmerkung mit dem Modifiern meinte ich so:
Habe ich schon geändert. ;)

Leider besteht das Problem mit dem iterieren noch.

Luckie 16. Sep 2008 07:06

Re: [c++] Durch Objektliste iterieren
 
So, ich sitze wieder in der Schule und versuche immer noch das Problem mit dem Iterieren zu lösen. :?

Habs, das const war zu viel, da habt ihr mich aber schön geärgert, als ihr das geändert habt. :mrgreen:

DMW 16. Sep 2008 09:15

Re: [c++] Durch Objektliste iterieren
 
Zitat:

Zitat von Luckie
das const war zu viel

Keineswegs; vielmehr ist in deinem Code ein const zu wenig. Wenn du eine non-const-Referenz zurückgibst, gibst du nicht nur ein Implementationsdetail preis, sondern zugleich dem Benutzer die Möglichkeit, die Liste direkt zu manipulieren, ohne daß er AddKonto() o.ä. aufrufen müßte.

Über eine konstante Liste kannst du aber natürlich nicht mit std::list<>::iterator, sondern mit std::list<>::const_iterator iterieren. (Für eine nicht konstante Liste funktioniert const_iterator natürlich auch.)

Luckie 16. Sep 2008 09:33

Re: [c++] Durch Objektliste iterieren
 
Hm, dann ändere ich das noch mal.

Jetzt funktioniert die Ausgabe nicht mehr:
Code:
for(iterKunden = _kunden.begin(); iterKunden != _kunden.end(); ++iterKunden)
   {
      cout << iterKunden->GetName().c_str() << ", " << iterKunden->GetVorname().c_str() << endl;
      list<CKonto>::const_iterator iterKonten;
      for(iterKonten = iterKunden->GetKonten().begin(); iterKonten != iterKunden->GetKonten().end(); ++iterKonten)
      {
         cout << iterKonten->GetBeschreibung().c_str() << endl;
         cout << iterKonten->GetSaldo() << endl;
      }
      cout << endl;
   }
Zitat:

Fehler 1 error C2662: 'CKonto::GetBeschreibung': this-Zeiger kann nicht von 'const CKonto' in 'CKonto &' konvertiert werden d:\bank\bank_c++2\bank\bank.cpp 48
Fehler 2 error C2228: Links von ".c_str" muss sich eine Klasse/Struktur/Union befinden. d:\bank\bank_c++2\bank\bank.cpp 48
Fehler 3 error C2662: 'CKonto::GetSaldo': this-Zeiger kann nicht von 'const CKonto' in 'CKonto &' konvertiert werden d:\bank\bank_c++2\bank\bank.cpp 49

DMW 16. Sep 2008 09:43

Re: [c++] Durch Objektliste iterieren
 
Zitat:

Zitat von Luckie
Jetzt funktioniert die Ausgabe nicht mehr:

Damit du die Getter-Methoden deiner Klasse auch für konstante Objekte aufrufen kannst, mußt du sie als const deklarieren:
Code:
class CKunde
{
  ...

public:
  std::string GetName(void) const;
  void SetName(std::string Name);
  std::string GetVorname(void) const;
  void SetVorname(std::string Vorname);
  const std::list<CKonto>& GetKonten() const;
  void AddKonto(CKonto& Konto);
};

Luckie 16. Sep 2008 09:52

Re: [c++] Durch Objektliste iterieren
 
Puh, ich weiß schon, warum ich lieber mit Delphi arbiete. :roll:

Danke, jetzt geht es.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz