Seite 1 von 1
QList mit structs möglich?
Verfasst: 10. Oktober 2007 15:39
von alfonsospringer
Code: Alles auswählen
struct skill
{
public:
QString name;
int lvl;
};
int main()
{
.........
.........
QList<skill> skills;
skill temp;
temp.name = "Schwerter";
temp.lvl = 8;
skills.append(temp);
};
Warum funktioniert das nicht? Wie mmüsste es richtig aussehen?
Verfasst: 10. Oktober 2007 15:48
von Volker
Was geht denn daran nicht? Bei mir funktioniert das, auch wenn das Schlüsselwort public in Structs überflüssig ist, da die Member von Structs in C++ standardmäßig sowieso public sind.
Verfasst: 10. Oktober 2007 15:59
von alfonsospringer
komisch, jetzt klappts
Hasst du villeicht noch eine Idee, wie ich rausfinden kann, ob eines der Elemente der Liste den Namen "xxx" hat?
Verfasst: 10. Oktober 2007 16:04
von Volker
Schreib dir nen == Operator für dein Struct. Dann sollte die contains Funktion von QList funktionieren. (siehe Doku:
http://doc.trolltech.com/4.3/qlist.html#contains)
Verfasst: 10. Oktober 2007 16:10
von alfonsospringer
wie schreibt man sich operatornen? hab ich noch nie gemacht ;(
Verfasst: 10. Oktober 2007 16:23
von Volker
Aber Google hast Du schon mal benutzt oder?
http://www.google.de/search?hl=de&q=ope ... uche&meta=
Code: Alles auswählen
struct skill
{
QString name;
int lvl;
bool operator==(skill const& b) const
{
// Vergleich könnte auch anders erfolgen
return name == b.name && lvl == b.lvl;
}
};
Verfasst: 10. Oktober 2007 16:42
von alfonsospringer
gelgengentlich (googleistdeinfreund.de) , thx - das Problem ist nur das verstehen ^^ Kannst du villeicht nochmal erklären, wofür bei der Parameterübergabe die consts notwendig sind?
Code: Alles auswählen
struct skill
{
QString name;
int lvl;
bool operator==(skill const& b) const
{
return name == b.name && lvl == b.lvl;
}
};
int main()
{
if (!skilllist.contains("Schwerter"))
{
skill temp;
temp.name = "Schwerter"
temp.lvl = 1;
skilllist.append(temp);
};
};
Produzier aber einen Fehler:
Code: Alles auswählen
window.cpp:47: error: no matching function for call to `QList<skill>::contains(const char[10])'
f:/Qt/4.3.1/include/QtCore/../../src/corelib/tools/qlist.h:640: note: candidates are: QBool QList<T>::contains(const T&) const [with T = skill]
Verfasst: 10. Oktober 2007 17:45
von Volker
Das
const zeigt dem Compiler, dass das übergebene Objekt nicht geändert wird bzw. in diesem Fall auch die aufgerufene Funktion die Objekte nicht ändert (bzw. ändern darf).
D.h. in diesem Fall darf innerhalb der == operator Methode sowohl
b als auch das Objekt auf dem die == Methode aufgerufen wird (also das was auf der linken Seite von == steht) durch die Ausführung von == nicht verändert werden.
Der Grund warum das
nicht funktioniert liegt daran, dass Du in einer
QList mit
skill Elementen nicht auf eine vorhandene Zeichenkette prüfen kannst. Du kannst nur auf vorhandene
skill Elemente prüfen. Eine Möglichkeit das etwas zu vereinfachen wäre nur den Namen beim Vergleich zu prüfen und einen skill-Constructor zu schreiben, der eine Zeichenkette als Parameter annimmt.
Aber das alles hat nichts mit Qt zu tun sondern ausschließlich mit C++, weshalb ich das Thema in ein entsprechendes Forum verlagern würde.
Verfasst: 10. Oktober 2007 17:55
von alfonsospringer
da hasst du wohl recht, srry