OOP & Datenstrukturen bzw. Datenschnittstellen

Alles rund um die Programmierung mit Qt
Antworten
Notwist
Beiträge: 85
Registriert: 2. März 2005 14:24

OOP & Datenstrukturen bzw. Datenschnittstellen

Beitrag von Notwist »

Hallo zusammen,

bin nicht so fit, was OOP betrifft und habe gerade ein grundlegendes Verständnisproblem.

Ich schreibe an einem C++/Qt-Programm, mit dem man Daten in Form von Listen ablegt und diese bearbeiten soll. Solange ich mit meinen Daten in einer Klasse arbeite, in der ich diese erschaffen habe, geht das auch alles. Wenn ich diese Daten aber für anderen Klassen zur Verfügung stellen möchte, dann breche ich mir immer einen ab.

Wie macht man das nun sauber?

Dachte mir, ich schreibe ein Klasse (MyContainer), in der ich meine Variablen / Listen ebenfalls erschaffe und in der Funktionen stehen, mit denen ich die Daten in der Klasse A (wo die Daten erschaffen wurden) an meine MyContainer übertrage, dort werden sie gespeichert und wer dann wieder auf diese Daten zugreifen möchte, erschafft ein Objekt der Klasse, zB.

Code: Alles auswählen

MyContainer giver;
und fordert sie an. Sieht dann so aus:

HEADER

Code: Alles auswählen

#ifndef MYCONTAINER_H
#define MYCONTAINER_H

#include "candata.h"
#include <qlistview.h>

class MyContainer  
{
public:
	MyContainer();
	~MyContainer();
	QPtrList<CanData> getPtrList();
	void givePtrList(QPtrList<CanData>);
	QListView getInputListView();
	void giveInputListView(QListView*);
	QListView getOutputListView();
	void giveOutputListView(QListView*);


private:
	QPtrList<CanData> canDataList;
	QListView *inputListView;
	QListView *outputListView;

};

#endif
myheader.cpp

Code: Alles auswählen

#include "mycontainer.h"
MyContainer::MyContainer()
{

}

MyContainer::~MyContainer()
{

}

QPtrList<CanData> MyContainer::getPtrList()
{
	return canDataList;
}

void MyContainer::givePtrList(QPtrList<CanData> list)
{
	canDataList=list;
}

QListView MyContainer::getInputListView()
{
	return *inputListView;
}

void MyContainer::giveInputListView(QListView *list)
{
	inputListView=list;
}

QListView MyContainer::getOutputListView()
{
	return *outputListView;
}

void MyContainer::giveOutputListView(QListView *list)
{
	outputListView=list;
}
Bin mir jetzt aber nicht sicher, ob das so geht oder ob die Daten, sobald aus der Klasse rausgesprungen wird, in der das MyContainer entry; geschaffen wurde, auch meine Daten in MyContainer verloren gehen.

Wie macht man das generell mit Datentransfer? Nur über Funktionen mit Return ist doch irgendwie zu kompliziert, oder?

Gruß, Notwist
Gruß, Notwist
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Folgender Vorschlag für den Header:

Code: Alles auswählen

#ifndef MYCONTAINER_H
#define MYCONTAINER_H

#include "candata.h"
#include <qlistview.h>

class MyContainer 
{
public:
   MyContainer() {}
   inline ~MyContainer() {}
   inline QPtrList<CanData> getPtrList() { return canDataList; }
   inline void givePtrList(QPtrList<CanData>) { canDataList=list; }
   inline QListView *getInputListView() { return inputListView; }
   inline void giveInputListView(QListView*) { inputListView=list;  }
   inline QListView *getOutputListView() { return outputListView; }
   inline void giveOutputListView(QListView*) { outputListView=list; }

private:
   QPtrList<CanData> canDataList;
   QListView *inputListView;
   QListView *outputListView;
};

#endif
Damit brauchst keinen Header mehr und inline's sind bei kleinen Funktionen schneller als keine.

Nunja und was genau ist dein Problem jetzt?
So kannst du komplett mit den Daten arbeiten, wenn du jedoch das gleiche ohne die schreibsel und return Dinger machen willst lässt nur den Con- und Destructor und die Privates und definierst die Klasse, die MyContainer benutzen soll als friend class.

Ich hoffe damit geholfen zu haben.
Notwist
Beiträge: 85
Registriert: 2. März 2005 14:24

Beitrag von Notwist »

Danke für die Tipps. Mein Problem lag noch darin, dass ich ein Objekt erschaffen hatte, über das die Daten gehalten werden, das dann gelöscht wurde. Hatte das Objekt nicht in der Hauptklasse gebildet. Mit Inline ist eine gute Sache. Nur:

Warum hast Du den Code in eine ZeigerFunktion geändert:

Code: Alles auswählen

inline QListView *getInputListView()
Gruß, Notwist
Gruß, Notwist
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Warum? Weil du einen Zeiger auf das QListView haben willst.
Notwist
Beiträge: 85
Registriert: 2. März 2005 14:24

Beitrag von Notwist »

Im Return darf man das nicht schreiben?
Gruß, Notwist
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Dann hast du aber keinen Zeiger auf das eigentliche Object, oder?
Antworten