Zeichen/Strukture in Objekt finden...

fbfeix

Erfahrenes Mitglied
Hallo Leute

ich würde gerne eine Klasse erstellen, genauergesagt eine Templateklasse.
Diese soll folgendermaßen aufgebaut sein. Ich übergebe der Klasse einen Typ:
C++:
Klasse<int> klasse; //oder:
Klasse <std::string> klasse;

soweitsogut..

Allerdings sollte diese Klasse bestimmte Zeichen(die sind natürlich auch vom übergebenen Typ) aus einer Eigenschaft diesen übergebenen Typs herausfinden. Die Eigenschaft sollte zum Beispiel "Content" heißen. Bei einem String hätte ich jetzt nicht wirklich Probleme diese Zeichen herauszufinden. Aber wie sieht es denn bei einem Integer oder einem beliebigen anderen Objekt aus?
 
Zuletzt bearbeitet von einem Moderator:
Hallo fbfeix

Was meinst du damit, dass du "Zeichen aus einer Eigenschaft diesen übergenen Typs herausfinden" willst? Was genau willst du suchen? Ob der Inhalt von Content in einer Variable dieses Typs vorkommt?

Gruss
Muepe
 
nein...
ich übergebe einen Typ. Jetzt mal als Beispiel std::string
Content ist eine Eigenschaft der Klasse. Sie hat jetzt mal den Wert "Das ist ein stinknormaler string".
und Zeichen diesen Typs wären jetzt (Zeichen vom Typ std::string), also meinetwegen "t" oder auch "ist" (also mehrere Zeichen).
Und jetzt will ich wissen wo genau bzw. ob "t" oder "ist" im Content sind.


Oder mit int als übergebenen Typ:
Content ist sagen wir mal 394839
Die "Zeichen" beispielsweise 3 und 8
jetzt will ich dass mir das Programm 3 und 8 herausfindet und mir die Position ausgibt

Als weitere Funktion hätt ich dann noch die Trennung an den bestimmten Positionen vorgesehen aber ich denke das wäre nicht mehr ganz so schwer wenn ich mal die Position habe.

Ich hoffe jetzt ist das klarer...
 
Zuletzt bearbeitet:
Also bei Strings ist das recht einfach, dafür gibt's in std::string die Funktion find.

Bei Integer-Werten eine Zahl zu suchen ist nicht ganz so einfach. Aber möglich wäre es, die integere Zahl in std::string um zu wandeln und dann wieder find anzuwenden.
 
ja aber ich hab ja auch des Problem dass mehr oder weniger eine Beliebige Klasse übergeben werden kann.
Also auch eine Klasse vom Typ "Apfel" mit den Eigenschaften "Aussehen" und "Geschmack" :D (sau blödes Beispiel).

Ich hatte schon die Idee den Content sowie die Zeichen in bytes oder halt chars als kleinste Einheit umzuwandeln. Leider habe ich aber überhaupt keine Idee wie ich das verwirklichen könnte und ob das überhaupt möglich wäre.
 
Man müsste bei jeder zu verwendende Klasse eine Methode compare (oder so) machen,
die das speziell für diese Klasse kann.
Generelle Vergleiche von beliebigen Objekten funktionieren anders nicht.

Man kann schon die Bytes eines Objekts hernehmen, nur ob das dann Sinn macht...
für eine beliebige Variable xyz bekommt man jedenfalls mit (char*)(&xyz)
ein char/byte-Array mit sizeof(xyz) Bytes.
 
Hallo,

du könntest eine freie (Template-)Methode ToString definieren, die dir deine Objekte in Strings umwandelt. Beispiel:

C++:
#include <iostream>
#include <sstream>
#include <string>

template<class T>
std::string ToString(const T& t) {
  std::ostringstream oss;
  oss << t;
  return oss.str();
}

template<>
std::string ToString<std::string>(const std::string& str) {
  return str;
}

struct Apfel {
  std::string Aussehen;
  std::string Geschmack;

  Apfel(const std::string& Aussehen_, const std::string& Geschmack_)
    : Aussehen(Aussehen_), Geschmack(Geschmack_) {}
};

template<>
std::string ToString<Apfel>(const Apfel& a) {
  return a.Aussehen + "," + a.Geschmack;
}

template<class T>
class Klasse {
 public:
  bool Contains(const T& haystack, const std::string& needle) {
    const std::string str = ToString(haystack);
    return str.find(needle) != std::string::npos;
  }
};

int main() {
  Klasse<int> klasseInt;
  std::cout << klasseInt.Contains(1234, "23") << std::endl;

  Klasse<std::string> klasseString;
  std::cout << klasseString.Contains("Wesel", "esel") << std::endl;

  Klasse<Apfel> klasseApfel;
  std::cout << klasseApfel.Contains(Apfel("rot", "suess"), "rot") << std::endl;

  return 0;
}

Grüße,
Matthias
 
Zurück