Seite 1 von 2
Problem mit QList: Einfügen eines eigenen Datentyps
Verfasst: 22. Februar 2009 19:01
von Illuminatus
so erstma der Source
Code: Alles auswählen
//dbvis.cpp
while(result.next()){
for(int i=0;i<result.size(); i++)
{
tupel *current = new tupel(i);
for(int y=0; y<meta_result.count(); y++)
{
current->getAttributes().append(result.value(y));
}
objekte->append(current);
}
}
Code: Alles auswählen
//tupel.h
public:
tupel(void);
tupel(int);
QList<QVariant> getAttributes(void);
~tupel(void);
private:
int serial;
QList<QVariant> attributes;
also nun ne kurze erklärung. ich hab das sql result und möchte die ganzen ergebnisse als Tupel in einer Liste Objekte haben. Dabei sollen die einzelnen Attribute wieder als Liste in einem Element Tupel vorhanden sein.
Leider wirft der VS08 Compiler folgenden Fehler:
Code: Alles auswählen
1>.\dbvis.cpp(104) : error C2664: 'QList<T>::append': Konvertierung des Parameters 1 von 'tupel *' in 'const tupel &' nicht möglich
1> with
1> [
1> T=tupel
1> ]
1> Ursache: Konvertierung von 'tupel *' in 'const tupel' nicht möglich
1> Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig
habt ihr eine ahnung woran das liegt?
Verfasst: 22. Februar 2009 19:12
von Christian81
QList<tupel> != QList<tupel*>
Verfasst: 22. Februar 2009 20:03
von Illuminatus
mhh jo ^^
aber wenn ich den konstruktoraufruf von tupel änder, wirft er mir folgenden fehler:
\dbvis.cpp(99) : error C2440: 'Initialisierung': 'tupel *' kann nicht in 'tupel' konvertiert werden
Verfasst: 22. Februar 2009 20:05
von Christian81
Ich würde sagen - C++ Basics fehlen hier.
Entweder Du möchtest eine Liste von Zeigern auf tupel - also QList<tupel*> oder eine Liste mit tupeln - QList<tupel>
Verfasst: 22. Februar 2009 20:25
von franzf
Du kommst ja aus der java-ecke, da ist es klar dass du zum Objekte anlegen immer das "new" gewohnt bist.
In C++ gibt es da 2 Möglichkeiten:
t zeigt auf ein tupel-objekt
t ist eine tupel-Instanz (objekt).
Aber wie Christian schon sagt sind das C++-Basics.
Du musst dir jetzt überlegen, ob du in der Liste Zeiger oder Instanzen haben willst. Eigentlich sollten es bei dir Instanzen tun.
Deshalb folgender Vorschlag:
Code: Alles auswählen
class dbvis {
private:
QList<tupel> objekte; // Zeiger auf ne Liste brauchts echt nicht!
};
// dbvis.cpp
while(result.next()) {
for(int i=0;i<result.size(); i++)
{
tupel current(i);
for(int y=0; y<meta_result.count(); y++) {
current.getAttributes().append(result.value(y));
}
objekte.append(current);
}
}
// edit:
Und hast du das in Java auch immer so gemacht, dass du die Member-Variablen public definiert hast? Das bricht jegliche Datenkapselung auf, da kannst du ja auch gleich C programmieren...
Mach das doch BITTE mit setVariable / getVariable.
Verfasst: 23. Februar 2009 12:45
von Illuminatus
ah okay, dankeschön
ja das mit der kapelsung hatte ich bei den tupeln schon gemacht, habs aber bei dbvis.h total vergessen! wie gesagt bin neuling und ist das erste mal ein komplettes programm zu schreiben, und nicht nur irgendwelche klassen.
habe ein ähnliches problem wieder
Code: Alles auswählen
void dbvis::readList()
{
for(int i=0; i<objekte.size();i++)
{
ui_SqlResult->setText(objekte.at(i).getSerial());
}
}
Code: Alles auswählen
\dbvis.cpp(118) : error C2662: 'tupel::getSerial': this-Zeiger kann nicht von 'const tupel' in 'tupel &' konvertiert werden
Verfasst: 23. Februar 2009 13:10
von pfid
Ist der Fehler vielleicht in der getSerial Methode?
Ausserdem: was genau versuchst du da zu programmieren? (sorry habe deinen letzten thread nur teilweise gelesen, verstehe daher die tupe-konstruktion nicht)
Verfasst: 23. Februar 2009 13:16
von Illuminatus
ich möchte die serial auf einem QTextEdit ausgeben um zu testen ob die elemente richtig eingefügt wurden:
Code: Alles auswählen
#pragma once
#include <QList>
#include <QVariant>
class tupel
{
public:
tupel(void);
tupel(int);
~tupel(void);
QList<QVariant> getAttributes(void);
int getSerial();
private:
int serial;
QList<QVariant> attributes;
/* Punkte werden als float[] gespeichert
*
*/
float front_linksoben[3];
float front_rechtsoben[3];
float front_linksunten[3];
float front_rechtsunten[3];
float rear_linksoben[3];
float rear_rechtsoben[3];
float rear_linksunten[3];
float rear_rechtsunten[3];
};
Code: Alles auswählen
#include "tupel.h"
/* Definition der Konstruktoren
*
*/
tupel::tupel(void)
{
}
tupel::tupel(int serial)
{
this->serial=serial;
}
tupel::~tupel(void)
{
}
QList<QVariant> tupel::getAttributes()
{
return attributes;
}
int tupel::getSerial()
{
return serial;
}
[/quote]
Verfasst: 23. Februar 2009 13:33
von franzf
Schau dir doch im Assistant die Methoden an.
Dein Problem ist FOlgendes:
constT& QList::at(int) const
Du bekommst da nur ein const Tupel zurück. getSerial ist (noch) keine const Funktion. getSerial darf das const Tupel nicht verändern, da das nicht der Fall ist (ist ja nur ein getter) häng hinten noch ein const bei der Funktion an, also:
int getSerial() const;
Musst du aber ebtsprechend auch in der tupel.cpp ändern.
Aber eigentlich sollten das alles Sachen sein, die du in deinem Kursus gesagt bekommen solltest (außer das ist ein "unterstütztes Selbststudium"), also in dem Fall nicht weiterempfehlen
Grüße
Franz
Verfasst: 23. Februar 2009 13:35
von Illuminatus
also so klappts nun
Code: Alles auswählen
void dbvis::readList()
{
for(int i=0; i<objekte.size();i++)
{
qDebug()<< objekte.operator[](i).getSerial();
}
}
im debug fenster bekomm ich allerdings bei nur 3 realen ergebnistupeln ganze 9mal folgende serial: 9437184
//@franzf
ah okay danke! ich hatte in der uni noch gar kein c++, sollen eine software für ein projekt entwickeln und versuch mich dafür in c++ (QT wegen) einzuarbeiten. ich versuchs mal so wies du gesagt hast

thx
Verfasst: 23. Februar 2009 13:39
von Illuminatus
hi k
also vielen dank so funktioniert es. da is nur noch irgendein fehler der die serials falsch vergibt. muss es mir nochmal aschaun =) thx auf jeden fall
Verfasst: 23. Februar 2009 13:40
von franzf
Illuminatus hat geschrieben:also so klappts nun
Code: Alles auswählen
void dbvis::readList()
{
for(int i=0; i<objekte.size();i++)
{
qDebug()<< objekte.operator[](i).getSerial();
}
}
operator[](i) geht zwar, ist doch recht unübersichtlich.
Mach doch einfach objekte
; das ruft dann den operator[] auf.
Les dich vllt. auch mal bissl in Operator-Überladung ein.
Verfasst: 23. Februar 2009 17:23
von Illuminatus
hi sry aber ich hab nochmal ne frage zu dem thema:
bei folgendem codefragment bekomm ich eine fehlermeldung während der laufzeit:
unbehandelte ausnahme bei 0x..... in dbvis.exe:...Zugriffsverletzung beim Lesen an Position 0x000...8
Code: Alles auswählen
void dbvis::readList()
{
for(int i=0; i<objekte.size();i++)
{
qDebug()<<objekte[i].getSerial();
for(int y=0; y<attributslaenge; y++)
{
(*) qDebug() << objekte[i].getAttributes().at(y);
}
}
}
das tritt auf bei der zeile * und aufgerufen wird die datei free.c oder malloc.c . es muss irgendwas mit dem zuweisen von neuem speicher tun zu haben, aber ihc hab keine ahnung was genau den fehler auslöst...
Verfasst: 24. Februar 2009 10:16
von erpheus
mach doch mal sicherheitshalber anstatt
folgendes
Verfasst: 24. Februar 2009 12:40
von Illuminatus
hi also das funktioniert! allerdings gibt er gar nichts auf der debug console aus.... ich vermute irgendwie dass diese felder gar nichts enthalten, das würde auch die speicherschutzverletzung ekrlären oder?
Also habs mir nochmal angeschaut und es sieht danach aus, als ob da nichts zurückgeliefert wird....
Code: Alles auswählen
while(result.next()){
tupel current(temp_serial);
for(int y=0; y<meta_result.count(); y++)
{
current.getAttributes().append(result.value(y));
}
objekte.append(current);
temp_serial++;
}
hier ist also irgendein fehler drin, so dass ncihts angehängt wird, habt ihr eine idee?
hab vor der zeile * noch ein qDebug() << result.value(y); angehängt und es zeigt alles an, aos muss der fehler beim anfügen an die liste erfolgen....