Problem mit QList: Einfügen eines eigenen Datentyps

Du bist neu in der Welt von C++? Dann schau hier herein!
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Problem mit QList: Einfügen eines eigenen Datentyps

Beitrag von Illuminatus »

so erstma der Source

Code: Alles auswählen

//dbvis.h
...
public
    QList<tupel> *objekte;

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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

QList<tupel> != QList<tupel*>
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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>
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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:

Code: Alles auswählen

tupel *t = new tupel
t zeigt auf ein tupel-objekt

Code: Alles auswählen

tupel t;
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.
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Beitrag 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
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag 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)
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Beitrag 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]
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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 :P

Grüße
Franz
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Beitrag 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
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Beitrag 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...
erpheus
Beiträge: 46
Registriert: 18. November 2008 11:55
Wohnort: Stuttgart

Beitrag von erpheus »

mach doch mal sicherheitshalber anstatt

Code: Alles auswählen

y<attributslaenge
folgendes

Code: Alles auswählen

 y < objekte[i].getAttributes().size()
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Beitrag 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....
Zuletzt geändert von Illuminatus am 24. Februar 2009 13:56, insgesamt 2-mal geändert.
Antworten