Seite 1 von 1

OOP & Datenstrukturen bzw. Datenschnittstellen

Verfasst: 18. April 2005 14:03
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

Verfasst: 19. April 2005 09:11
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.

Verfasst: 19. April 2005 13:02
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

Verfasst: 19. April 2005 13:40
von FlorianBecker
Warum? Weil du einen Zeiger auf das QListView haben willst.

Verfasst: 19. April 2005 13:53
von Notwist
Im Return darf man das nicht schreiben?

Verfasst: 19. April 2005 14:00
von FlorianBecker
Dann hast du aber keinen Zeiger auf das eigentliche Object, oder?