STL for_each mit list<EigeneKlasse>

Terrakotta001

Grünschnabel
Hallo,
Möchte mir ein Vokabeltrainer programmiern.

Mein Vokabeltrainer soll die Leistung aufweisen.
1) Text Einlesen und vokabel in Container Liste einfügen.
2) sortieren
3) korrekte geantwortet vokabel in andere list schmeißen
mein problem ist der foreach. der wills einfach nicht ...


ich habe mit STL gearbeitet.
1) wird der text eingelesen. Mit ' : ' doppelpunkt soll deutsches wort von englishen trennen.
2) mit getline und istringstream lässt die trennung leicht bewerkstelligen
3) mit der trennung wird dann auch gleich in die liste eingefügt (ähnlich wie array nur ohne Arraygröße + einiges an Vorteil Funktionen unwiderstehlich)
4) ja wenn die liste schon mal aufgefüllt ist, dann steht dir alles zur verfügung was dir dein herz begehrt.

Struktur sieht bei mir so.
Klasse: Vokabel => Eigenschaften sind string deutsch und english
dann die main mit list<Vokabel> lstVokabel. über pushback lässt sich alle vokabel sehr leicht einfügen. ja und wie gesagt dann steht dir alles offen.

einziges manko bei mir, ist die for_each. ich kann mir kein Vokabel elemente ausgeben. Ich weiss aber dass man mit operator übergabe arbeiten muss. weiss aber nicht wie. Einlesen und einfügen ins liste ist bei mir klaro.

vielleicht kann man mir hier weiterhelfen.

hier unten ist nochmal der code. ist ziemlich lang ... aber ohne inhalt. Die Zeile mit dem for_each ist mein problem, denn so geht aufjedenfall nicht.


===================

#include <iostream>
#include <string>
#include <fstream>
#include <list>
#include<algorithm>
#include<vector>

#include "Vokabel.h"
#include "Ausgabe.h"

using namespace std;

void main()
{
list<Vokabel> lstVokabel;
list<Vokabel> lstVokabelFalse;
list<Vokabel> lstVokabelCorrect;

list<Vokabel>::iterator iter;

iter = lstVokabel.begin();
// Vokabel aus Text Datei ins Vokabel Liste Einfügen
lstVokabel.push_back(Vokabel("one", "ein"));
lstVokabel.push_back(Vokabel("two", "zwei"));
lstVokabel.push_back(Vokabel("three", "drei"));
lstVokabel.push_back(Vokabel("four", "vier"));

//Abfragen solange lstVokabel leer ist

for_each(lstVokabel.begin(), lstVokabel.end(), iter->Foreach_Show); ////////FEHLER//


}

============================================================
=============================================================

#pragma once
#include <string>
using namespace std;
class Vokabel
{
private:
string _deutsch;
string _english;

public:
Vokabel(void);
~Vokabel(void);
Vokabel(string, string);

void Show();
void Foreach_Show(string, string);
string Get_deutsch();
void Set_deutsch(string);
string Get_english();
void Set_english(string);
};
===========================================================
====================================================
#include "Vokabel.h"
#include <string>
#include <iostream>
using namespace std;

Vokabel::Vokabel(void)
{
}
Vokabel::Vokabel(string de, string en)
{
_deutsch = de;
_english = en;
}

Vokabel::~Vokabel(void)
{
}

void Vokabel::Show()
{
cout<< _deutsch << " " << _english<<endl;
}
void Vokabel::Foreach_Show(string de, string en)
{
cout<< de << " " << en <<endl;
}

string Vokabel::Get_deutsch()
{
return _deutsch;
}
void Vokabel::Set_deutsch(string de)
{
_deutsch = de;
}

string Vokabel::Get_english()
{
return _english;
}
void Vokabel::Set_english(string en)
{
_english = en;
}
 
Hallo,
Code:
for_each(lstVokabel.begin(), lstVokabel.end(), iter->Foreach_Show);
hier dürfte das 3. Argument von for_each falsch sein. Es wird ein function object erwartet, du lieferst aber eine member function für 2 Argumente.
Probiere doch mal dieses:
Code:
list<Vokabel>::iterator iter;
for (iter = IstVokabel.begin(); iter != IstVokabel.end(); iter++)
  iter->Foreach_Show();
Du müsstest noch die Argumentliste von Vokabel::Foreach_Show() reduzieren.

[EDIT] Ich sehe, du hast ja schon eine passende Funktion:
Code:
list<Vokabel>::iterator iter;
for (iter = IstVokabel.begin(); iter != IstVokabel.end(); iter++)
  iter->Show();
 
Danke Danke ...

class functor
{
void operator() (Vokabel &v)
{
v.show();
}
};
for_each(..., ..., functor());

man muss es über operator überladen arbeiten.
Hab das zwar noch nicht umgesetzt aber schon bei manchen gesehen und es sieht auch sehr vernünftig aus
 
Auch hier Quatsch: std::mem_fun, std::mem_fun_ref sind hier Gold wert!
cpp Code:
  1. #include <list>
  2. #include <algorithm>
  3. #include "Vocabulary.hpp"
  4. int main()
  5. {
  6. std::list<Vocabulary> lstVokabel;
  7. // Vokabel aus Text Datei ins Vokabel Liste Einfügen
  8. lstVokabel.push_back(Vocabulary("one", "ein"));
  9. lstVokabel.push_back(Vocabulary("two", "zwei"));
  10. lstVokabel.push_back(Vocabulary("three", "drei"));
  11. lstVokabel.push_back(Vocabulary("four", "vier"));
  12. std::for_each(lstVokabel.begin(), lstVokabel.end(), std::mem_fun_ref(&Vokabel::show));
  13. }


cpp Code:
  1. #if !defined (VOCABULARY_HPP__INCLUDED)
  2. #define VOCABULARY_HPP__INCLUDED
  3. #pragma once
  4. #include <string>
  5. #include <iostream>
  6. class Vocabulary
  7. {
  8. std::string m_german;
  9. std::string m_english;
  10. public:
  11. explicit Vocabulary(std::string const& first = "", std::string const& second = "")
  12. : m_german(first), m_english(second)
  13. {}
  14. public:
  15. void show() const { std::cout << m_german << " = " << m_english << std::endl; }
  16. public:
  17. std::string const& get_german() const { return m_german; } // implizit inline, const, no copy of m_german
  18. void set_german(std::string const& german) { m_german = german; } // implizit inline, no copy of german
  19. std::string const& get_english() const { return m_english; } // implizit inline, const, no copy of m_german
  20. void set_english(std::string const& english) { m_english = english; } // implizit inline, no copy of german
  21. };
  22. #endif // VOCABULARY_HPP__INCLUDED

so sieht dein Header mal anständig Implementiert aus.

Dann kannste dir die Funktion show sparen, wenn du operator<< mal anständig überlädst!
 
Zuletzt bearbeitet:
Zurück