Array innerhalb mehrerer Klassen verwenden (pos. erledigt) C++ 

Status
Für weitere Antworten geschlossen.

f.o.g.

Registered +
Registriert
März 2008
Beiträge
495
hi ich hätt da mal ne frage
ich hab folgendes problem:
und zwar hab ich eine klasse in der ein array bestehend aus einer struktur mit werten gefüllt wird in einer anderen klasse will ich nun auf diese werte rein lesetechnisch zugreifen können. da die einzelnen arrays privat sind hab ich an ne getFeld Methode gedacht nur weiß ich nicht wie ich die genau implementieren soll. am ehesten würde das wohl mit zeiger bzw referenz gehn nur wie?
freue mich über jede hilfe
danke greetz der f.o.g.
 
Zuletzt bearbeitet von einem Moderator:
Bei der Menge an Informationen...

Code:
class A {
private: 
int* array;

public:
int* getArray() {
return array;
}

}
 
an sowas hatte ich gedacht probiers morgen mal aus aber danke schonmal

// naja habs probiert und wie sollte es anders sein geht nicht bzw was eher der fall ist ich bin zu doof dafür :(
ich versuchs nochmal etwas genauer zu erklären ich hab ne klasse parse und ne klasse window. in meiner parse klasse hab ich per typdef ein array erstellt welches ne struct enthält. diese array wird in der parse klasse mit werten gefüllt. wenn alles durchgelaufen ist möchte ich diese werte in meiner windowklasse verwenden.
der code den skyte gepostet hat funzt iwie nicht oder ich mach was falsch. was mir sehr weiterhelfen würde wäre noch wie ich dann in der windowklasse drauf zugreifen kann.
 
Zuletzt bearbeitet von einem Moderator:
PHP:
#include 
#include 
#include 
using namespace std;

class Second;

#define MAX_VA_COUNT 50

struct sValues { // beispiel struct, enthält 2 int werte
int a;
int b;
};

/**
Erste Klasse füllt array mit werten von 0 - 49 (a + b des structs)
*/
class First { 
public:
First() {
// aloc memory
m_manyVals = new sValues[MAX_VA_COUNT];

// werte füllen
for(int i = 0; i < MAX_VA_COUNT; i++) {
m_manyVals[i].a = i;
m_manyVals[i].b = i;
}
}

~First() {
// free memory
delete[] m_manyVals;
}

// Gibt pointer auf array zurück
sValues *GetValArray() {
return m_manyVals;
}

private:
// Array des structs
sValues *m_manyVals;
};

class Second {
public:
// Setter für den pointer auf das struct
void SetManyVals(sValues *val) {
m_manyVals = val;
}

private:
// beinhaltet nach dem setzen den pointer auf das struct-array (achtung, werte können auch geändert werden)
sValues *m_manyVals;
};

int main()
{
First first;
Second second;

// hier wird ein pointer auf das array von first geholt und an second weitergegeben
second.SetManyVals(first.GetValArray());

int a;
cin >> a;

return 0;
}

Hier mal ein Beispiel wie man es machen könnte...
 
@Zerd
okay....:read::read::read: danke erstmal an dich für deine mühe aber,
die methode die Skyte angeführt hat sieht ja für mich etwas schlanker aus, ist demenstprechend für mich auch besser zu verstehen, eventuell kannst du mir ja dazu nochmal ein paar tips geben wie ich dann in meiner window klasse das array aufrufe.
bitte versteh mich nicht falsch ich schätze deine hilfe sehr nur bin ich einfach noch zu newbie in der oop, als das ich alles auf anhieb kapiere. sorry wenn ich mich an der stelle etwas dumm anstelle.
greetz der f.o.g.
 
Ich habe nur Skytes beispiel etwas vergrößert...

Du hast gesagt du hast eine klasse in dem ein array mit werten steht:
-> In meinem Beispiel die Klasse "First" mit dem array *m_manyVals;

Dann hast du gesagt du willst das array einer zweiten Klasse bekannt machen:
-> In meinem Beispiel die Klasse "Second".

Das "bekannt machen" wird in der main funktion gemacht. Das musst du dann an der Stelle deines programms machen, nachdem das array gefüllt wurde. (Wo genau kann ich dir nicht sagen, ich kenn dein Projekt nicht)
Jedenfalls hole ich mit der methode GetValArray() aus Klasse First den pointer zum array. mit der Methode SetManyVals(sValues *) setze ich den pointer auf das array.

Das beispiel soll dir zeigen wie du in klasse 2 mit den werten von klasse 1 arbeiten kannst...
 
also wenn ich dich richtig verstanden hab kann ich in der 2ten klasse über
"m_manyVals" auf die Elemente der ersten Klasse zugreifen oder?
 
Ja, aber erst nachdem du diesen aufruf gemacht hast:
PHP:
second.SetManyVals(first.GetValArray());
Vorher ist der pointer nicht definiert und kann zu nem absturz führen...

Die namen der Variablen kannst du natürlich setzen wie du willst
 
ja das leuchtet ein trotzdem hab ich noch ne frage zum code
gibt es einen unterschied zwischen
Code:
m_manyVals = new sValues[MAX_VA_COUNT];
und
Code:
typedef struktur feld[ds]; 

class parse
{
private:

feld deutsch;
?
wenn ja welchen und geht meine variante genauso oder sollte ich deinem beispiel folgen
 
Ok, jetzt weiß ich auch wieso mein code für dich so kompliziert war... Du hast von ner Struktur gesprochen, deshalb habe ich ein struct erstellt.
der name "struktur" für ein array ist ziemlich irreführend...

Du kannst auch ein fest definiertes Array benutzen. Bei meiner variante wird der Speicher dynamisch reserviert bzw. frei gegeben. Aber so wie du es machst geht es auch.
 
ja ich hab doch auch ne struktur ich poste mal den kompletten code:
Code:
#include 
#include 
#include 
#include 
#include 
#include 
#include "window.h"

using namespace std;


const int ds= 22; // Anzahl der Datensätze
const int mgl=10; // Anzahl der möglichkeiten

struct struktur //Legt die Struktur der Datensätze fest
{ 
// int id; // ID der Auswahlmöglichkeit = der ID der xml Datei
string title; //Überschrifft
string subtitle;
string inhalt[mgl]; //Auswahlmöglichkeit
string inhalt_checkbox[mgl];



};
struct user
{
int combo ; //evtl auch string
bool check;
};

typedef struktur feld[ds]; //in der main dann mit feld und einem Namen definieren!!!
typedef user nutzer[ds];




class parse
{
private:

feld deutsch;
nutzer nutzereingabe;


//Private Funktionen

parse (void); // ehemaliges Hauptprogramm - rudt nacheinander die einzelnen Bestandteile des Programms auf
void lang (string,bool&);//bestimmt die Sprache der folgenden Zeilen
void finde(string,string,bool&,int&);//findet übergebenen String
void parse_title(string,feld&,bool&,int,int&);//Parset den Titel
void parse_subtitle(string,feld&,bool&,int); //Parset den Untertitel
void parse_inhalt(string,feld&,bool&,int,int&);//Parset Inhalt des Labels (einer Combobox)
void parse_inhalt_checkbox(string,feld&,bool&,int,int&);//Parset Inhalt einer Checkbox

//Öffentliche Funktionen
public:

jetzt wollte ich quasi das array deutsch übergeben an meine klasse window in der ich das dann über qt ausgebe(der qt algorithmus steht schon - keine angst:D)
 
Zuletzt bearbeitet von einem Moderator:
Was sollen denn die typedefs bewirken??
1. sind die syntaktisch so falsch ;)
und 2. machen sie semantisch auch keinen sinn... das struct sollte eh logisch richtig benamt sein, wieso also per typedef neu definieren?
 
nun ja ich hatte das programm ursprünglich für konsole geschrieben da lief es so wunderbar. also was genau ist denn nun falsch?
ich mein ich kann deinem code schon folgen erachte den auch als sinnvoll. sollte ich meinen code deinem anpassen?
typdefs hab ich gemacht weil ich mehrere arrays von diesem typ habe einmal deutsch einmal englisch
 
Ah sorry das mit den typedefs ist syntaktisch doch korrekt, bin nur mal wieder mit der benamung durcheinander gekommen...

Ja kannst du so machen... ist ja auch so ziemlich mit meinem beispiel kompatibel nur das du die zeilen mit dem new und delete nicht brauchst....
 
also entweder hab ichs nicht verstanden (wahrscheinlich) oder nicht korrekt implementiert (noch wahrscheinlicher):depp::depp:

Code:
#ifndef parse_h
#define parse_h

#include "windows.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include "window.h"

using namespace std;


const int ds= 22; // Anzahl der Datensätze
const int mgl=10; // Anzahl der möglichkeiten

struct struktur //Legt die Struktur der Datensätze fest
{ 
// int id; // ID der Auswahlmöglichkeit = der ID der xml Datei
string title; //Überschrifft
string subtitle;
string inhalt[mgl]; //Auswahlmöglichkeit
string inhalt_checkbox[mgl];



};
struct user
{
int combo ; //evtl auch string
bool check;
};

typedef struktur feld[ds]; //in der main dann mit feld und einem Namen definieren!!!
typedef user nutzer[ds];




class parse
{
private:

feld *deutsch;
nutzer nutzereingabe;


//Private Funktionen


void lang (string,bool&);//bestimmt die Sprache der folgenden Zeilen
void finde(string,string,bool&,int&);//findet übergebenen String
void parse_title(string,feld&,bool&,int,int&);//Parset den Titel
void parse_subtitle(string,feld&,bool&,int); //Parset den Untertitel
void parse_inhalt(string,feld&,bool&,int,int&);//Parset Inhalt des Labels (einer Combobox)
void parse_inhalt_checkbox(string,feld&,bool&,int,int&);//Parset Inhalt einer Checkbox

//Öffentliche Funktionen
public:
parse (void); // ehemaliges Hauptprogramm - rudt nacheinander die einzelnen Bestandteile des Programms auf
feld * GetFeld()
{
return deutsch;
}




};
#endif
und die zweite klasse

Code:
#ifndef window_h
#define window_h
#include 
#include
#include QString>
#include "parse.h"




class window : public QWidget
{
Q_OBJECT

private:

QString rueck_combo[5];
QString rueck_check[5];
QPushButton * but1;
QPushButton * but2;
QPushButton * but3;
QComboBox * combo[5];
QComboBox * combo2;
QCheckBox * check[5];
QVBoxLayout *hlayout;
QVBoxLayout *hlayout_ok;
QGridLayout *glayout;
QLabel *label1[5];
void erzeuge_combo(void);
void erzeuge_check(void);
feld * test;



public:
window(QWidget *parent = 0);
void setTest(feld *val)
{
test = val;
}




public slots:

void getCItem(void);
void resetLabel(void);
};

#endif

compiler meldet 6 fehler...
meist syntaxfehler in verknüpfung mit feld.
 
Ohne Typedef wär es einfacher, aber du musst in Klasse 1 die methode so ändern:
PHP:
feld *GetFeld()
{
return &deutsch;
}
und bei den private attributen:
PHP:
private:

feld deutsch;
schreiben.

In Klasse 2 müsste so alles stimmen...

Übrigens hat man mit QT noch weitaus schönere möglichkeiten durch die Slots und Signals... Vielleicht solltest du dir mal ein paar Tutorials anschauen um dieses System zu verstehen. Qt 4.4.3: Qt Tutorial
 
das mit qt ist mir bekannt nur hatte ich nich so wirklich lust alles auf signal slot zu "portieren"
ich probier gleich mal aus obs geht.

nein immernoch die selben compilermeldungen :(

// edit: aus irgend einem mir unbekanntem problem meint der compiler
...\window.h(32) : error C2143: Syntaxfehler: Es fehlt ';' vor '*'

bei der deklarierung von test.

// kann auch zu hab die methode von zerd genommen die wirklich perfekt geht. vielen vielen dank für die top erklärung und die mühe.
 
Zuletzt bearbeitet von einem Moderator:
Status
Für weitere Antworten geschlossen.
Zurück
Oben Unten