Zum Inhalt springen

VC++ Datenübertragung in externe Klassen


Empfohlene Beiträge

Hallo an Alle,

ich habe folgendes Problem. Ich hab mehrere Seiten in einer Reiterstruktur (TabControl). Auf diesen Seiten werden Daten eingelesen, angezeigt und in eine externe (also von mir neu eingerichtete) Datenklasse eingetragen. In der Datenklasse befinden sich die Datenarrays, sowie die Methoden um auf sie zuzugreifen. Ich möchte nun von den Seiten die Methoden der Datenklasse aufrufen, denen ich dann als Parameter die Daten übergebe. Diese Daten werden dann in den Methoden in die Datenarrays eingetragen. Dies funktioniert auch auf allen Seiten. Einziges Problem: Ich kann von z.B. Seite 2 nicht Daten aus den Feldern der Datenklasse auslesen, die Seite 1 reingeschrieben hat.

Ich habe zu Beginn auf allen Seiten Variablen der Datenklasse erstellt. Sobald ich jedoch über eine Variable auf die Methoden zugreife, erzeugt das Programm ein Objekt mit Gültigkeitsbereich. Da dann der Zugriff der einen Seite einen anderen Gültigkeitsbereich hat als die nächste, kann ich nicht auf die Daten einer anderen Seite zugreifen. Mit Pointern wäre es das gleiche, da ich auch hier über eine Variablenadresse gehen muss. Nur wie realisiere ich es, dass alle Seiten auf die selben Felder der Datenklasse zugreifen und nicht auf die gleichen? Ich habe es auch schon mit einem direkten Klasenpointer über den Scopeoperator probiert, jedoch ohne Erfolg. Kann mir einer helfen?

Gruß

KK

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Markus,

jede Seite hat ihre eigene Klasse, CPage1, CPage2 ...

Ich habe nun in den Header-Dateien der Seiten Page1, Page2 ... jeweils eine Variable der Datenklasse erstellt.

Page1.h

CData Page1,

Page2.h

CData Page2 ...

Ich weiss, dass das ein Fehler ist, weil ich so verschiedene Objekte der Datenklasse deklariere und somit jede Seite NICHT in dieselben Bereiche der Datenklasse schreibt und darüber hinaus vermutlich die gespeicherten Werte noch nicht mal direkt in die Datenklasse eingetragen werden, sondern in das erzeugte Objekt, dass die DatenFelder im Speicher neu erzeugt. Ich habe nur keine Ahnung wie ich den Zugriff richtig hinbekomme. Wenn Du mir einen Tip geben könntest, wäre ich dankbar.

Gruß

KK

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du die Klasse statisch, bzw einen internen daten speicher (ArrayList, HashTable oder sonst irgendeine Collection) statisch anlegst, wird für jede Instanz der klasse der selbe schbeicher bereich reserviert.

Ergo hast du das Selbe object für alle. Entweder dein DatenSpeicher oder deine Collection, wie das auch immer besser in dein code reinpasst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Trux,

danke für die Antwort, dein Vorschlag hört sich gut an. Ich habe nur noch ein Problem. static läst sich unter VC++ nicht so einbinden wie unter C++. In einem Tutorial stand, dass man zu der Variablen (static CString Text; ) auch noch die Definition der static-Variablen vornehmen muss (CString CData::Text=""; ). In VC++, deklariere ich die Variable in der Headerdatei. In der cpp-Datei initialisiere ich dann im Konstruktor die Variablen, wenn ich dort aber nun die Definition für die static-Variable Text eintrage, meckert der Compiler verständlicherweise, weil ich Text nochmal CString zuweise. Diese Schreibweise um eine static-Variable zu definieren stand aber in mehreren c++Tutorials. Kannst du mir sagen, was ich bei VC++ anders machen muss?

Gruß

KK

Link zu diesem Kommentar
Auf anderen Seiten teilen

static läst sich unter VC++ nicht so einbinden wie unter C++.
Unsinn.

wenn ich dort aber nun die Definition für die static-Variable Text eintrage, meckert der Compiler verständlicherweise, weil ich Text nochmal CString zuweise.
Wie äußert sich denn dieses "Meckern". Sprich: Wie lautet die genaue Fehlermeldung?

Kannst du mir sagen, was ich bei VC++ anders machen muss?
Gar nichts. Zeig mal deinen Code.

Und weil das offenbar nichts mit .NET zu tun hat: Verschoben -> C++: Compiler, IDEs, APIs

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe nun in den Header-Dateien der Seiten Page1, Page2 ... jeweils eine Variable der Datenklasse erstellt.
Das ist - wie du selbst schon bemerkt hast - ein Fehler.

Irgendwo erzeugst du doch diese Page-Objekte. Da kannst du doch einfach die Adresse eines einzelnen Datenobjekts an einen Member-Zeiger in jeder Seite übergeben. Dann haben alle Seiten einen Zeiger auf dasselbe CData-Objekt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Klotzkopf,

hier meinen Code der Headerdatei:


class CDaten : public CDialog

{

// Konstruktion

public:

	CDaten(CWnd* pParent = NULL);   // Standardkonstruktor


	static void SetValue(CString Value){Titel=Value;}

	static CString GetValue(){return Titel;}


// Dialogfelddaten

	//{{AFX_DATA(CDaten)

	enum { IDD = IDD_DIALOG1 };

	//}}AFX_DATA



// Überschreibungen

	// Vom Klassen-Assistenten generierte virtuelle Funktionsüberschreibungen

	//{{AFX_VIRTUAL(CDaten)

	protected:

	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung

	//}}AFX_VIRTUAL


// Implementierung

protected:


	// Generierte Nachrichtenzuordnungsfunktionen

	//{{AFX_MSG(CDaten)

		// HINWEIS: Der Klassen-Assistent fügt hier Member-Funktionen ein

	//}}AFX_MSG

	DECLARE_MESSAGE_MAP()


	static CString Titel;

};

und hier meine cpp-Datei

CDaten::CDaten(CWnd* pParent /*=NULL*/)

: CDialog(CDaten::IDD, pParent)

{

//{{AFX_DATA_INIT(CDaten)

// HINWEIS: Der Klassen-Assistent fügt hier Elementinitialisierung ein

//}}AFX_DATA_INIT

CString CDaten::Titel="TEST";

}

void CDaten::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CDaten)

// HINWEIS: Der Klassen-Assistent fügt hier DDX- und DDV-Aufrufe ein

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CDaten, CDialog)

//{{AFX_MSG_MAP(CDaten)

// HINWEIS: Der Klassen-Assistent fügt hier Zuordnungsmakros für Nachrichten ein

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

Fehlermeldung:

error C2655: 'Titel' : Definition oder Neudeklaration im aktuellen Gueltigkeitsbereich unzulaessig

Das ist natürlich nicht das eigentlich Programm, an dem ich arbeite, sondern nur ein kleines Programm um an dem Problem zu arbeiten. In meinem richtigen Programm habe ich mehrere Datenfelder, doch wenn das hier funktioniert, kann ich es 1:1 in meinem Programm adaptieren.

Was habe ich falsch gemacht?

Gruß

KK

Link zu diesem Kommentar
Auf anderen Seiten teilen

Was habe ich falsch gemacht?

Moin Kampfkartoffel,

Dieser Aufruf

CString CDaten::Titel="TEST";

im Konstruktor ist der Übeltäter!

Du deklarierst doch schon in der Headerdatei den Titel und nun willst du ihn nochmal anlegen. Nimm doch mal das "CString CDaten::" weg. ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Hexagon,

das habe ich auch schon probiert, da kommen dann folgende Fehlermeldungen:

Daten.obj : error LNK2001: Nichtaufgeloestes externes Symbol "protected: static class CString CDaten::Titel" (?Titel@CDaten@@1VCString@@A)

TestDlg.obj : error LNK2001: Nichtaufgeloestes externes Symbol "protected: static class CString CDaten::Titel" (?Titel@CDaten@@1VCString@@A)

Debug/Test.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise

In den Tutorials und Erklärungen stand drin, dass man die Variable genau so (CString CData::Titel="XXX")definieren muss. Leider gibt er dann bei mir die Fehlermeldung vom Vorpost raus.

Gruß

KK

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dieser Aufruf
CString CDaten::Titel="TEST";

im Konstruktor ist der Übeltäter!

Der Code ist richtig. Nur die Position ist falsch.

Statische Member müssen auf globalem Scope (also nicht in einer Methode) definiert werden.

@Kampfkartoffel:

Überleg dir noch mal den Ansatz, den ich vorgeschlagen habe. Das ist sauberer, als die Member statisch zu machen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

@Hexagon, ich habe in dem Hinschreiben schon fast alles ausprobiert. Es kommt aber immer eine Fehlermeldung, vermutlich wegen der Sache, die Klotzkopf schrieb.

@Klotzkopf

Ich bin bei der static-Methode geblieben, weil sie mir einfacher erschien. Wäre nett wenn Du mir bei deiner Idee ein bisschen unter die Arme greifen könntest.

Ich habe eine PropertySheet-Klasse, über die die Pages einggliedert werden (Da die CPropertySheet nicht verändert, sondern einfach nur erstellt wird, poste ich sie nicht.) Mein Hauptprogramm, indem dann die Seiten erstellt werden, sieht so aus:

Ich habe meinen Entwurf Programm2 genannt!

Programm2.cpp


#pragma once 

#include "stdafx.h"

#include "Programm2.h"

#include "Daten1.h"  //Datenklasse

#include "Parent.h" //CPropertySheet

#include "Programm2Dlg.h"  //CPropertyPage

#include "Page2.h"  //CPropertyPage




#ifdef _DEBUG

#define new DEBUG_NEW

#endif




BEGIN_MESSAGE_MAP(CProgramm2App, CWinApp)

	ON_COMMAND(ID_HELP, CWinApp::OnHelp)

END_MESSAGE_MAP()


CProgramm2App::CProgramm2App()

{

}


CProgramm2App theApp;



BOOL CProgramm2App::InitInstance()

{


	InitCommonControls();


	CWinApp::InitInstance();


	AfxEnableControlContainer();


	SetRegistryKey(_T("Vom lokalen Anwendungs-Assistenten generierte Anwendungen"));




	CProgramm2Dlg Dialog1;

	Page2 Dialog2;

	CParent Parentsheet("Test");


	Parentsheet.AddPage(&Dialog1);

	Parentsheet.AddPage(&Dialog2);


	m_pMainWnd = &Parentsheet;


	int nResponse = Parentsheet.DoModal();


	if (nResponse == IDOK)

	{

	}

	else if (nResponse == IDCANCEL)

	{

	}

	return FALSE;

}

Wenn ich dich richtig verstanden habe, muss ich im Hauptprogramm jetzt schon die Verbindung zur Datenklasse herstellen. Ich könnte also einem Pointer der Klasse CData die Adresse einer Variablen der Klasse CData zuweisen und dann von den Seiten auf den Pointer zugreifen. Dieses kann ich aber vermutlich nicht in der Headerdatei (Programm2.h) machen, da dafür im Anfang von Programm2.cpp die Daten-Headerdatei (Daten.h) vor der Hauptprogrammheaderdatei (Programm2.h) reingeschrieben werden müsste, was nicht geht. Wie erzeuge ich nun eine eindeutige Verbindung zur Datenklasse?

Gruß und Dank

KK

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn ich dich richtig verstanden habe, muss ich im Hauptprogramm jetzt schon die Verbindung zur Datenklasse herstellen.
Nein. Das müsstest du nur, wenn du meinen Ansatz verfolgen würdest.

Aber du willst ja die statische Variable. Da brauchst du nicht mal eine Instanz von CData. Du kannst einfach mit CData::deineStatischeVariable darauf zugreifen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Kampfklotz,

da habe ich mich wohl missverständlich ausgedrückt. Als ich schrieb, Du mögest mir bei Deiner Idee unter die Arme greifen, meinte ich Deine Idee mit der Verbindung zur Datenklasse in dem Hauptprogramm und nicht den static-Variabeln. Auch wenn das mit den static-Variabeln wahrscheinlioch einfacher ist, kommt es mir doch unsauber vor. Könntest Du mir zeigen, wie ich nun in dem Hauptprogramm die Verbindung herstelle und sicherstelle, dass alle Seiten mit denselben Methoden auf dieselben Datenfelder und Variablen zugreifen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Eeeehm sorry ich meinte natürlich Klotzkopp,

ich hab jetzt versucht das Problem irgendwie zu lösen, ich kriegs aber nicht auf die Palette. Da das ganze seit mehreren Tagen so geht, drückt das doch ordentlich auf die Moral.

Ich kann in der Headerdatei meiner Hauptprogrammdateien (Programm2.cpp und Programm.h) keine Variablen einer anderen Klasse einbinden, da alle Klassen in der cpp-Datei erst nach der Hauptprogrammdatei stehen müssen.

z.B., so muss es sein:

# include Programm2.h //Hauptprogrammklasse

# include Daten.h //Datenklasse

# include PropertySheet.h

# include Page1.h

# include Page2.h

es geht nicht:

# include Daten.h //Datenklasse

# include Programm2.h //Hauptprogrammklasse

# include PropertySheet.h

# include Page1.h

# include Page2.h

da das so ist, kann ich keine Variable oder Pointer in der Programm2.h erzeugen, die zum Beispiel, wie in meinem gewollten Fall, auf die Datenklasse zeigen. Wenn ich aber nun den Pointer und die Variable nicht in der Headerdatei unterbringen kann, sondern nur lokal in der cpp-Datei, dann kann ich von den Seiten (Page1, Page2) mit Pointern auf die Hauptprogrammklasse CProgramm2 *Hauptklasse, m_Haupt) nicht auf den Pointer zur Datenklasse zugreifen, weil dieser nicht in der Headerdatei steht. Ich hatte dann als Idee eine neue Klasse zu erzeugen, die ich im Headerlisting vor die Datenklasse setzen kann und die dann den einzigen Pointer zur Datenklasse setzt. Aber dann hüpfe ich von meinen Seitenpointern über den NeuKlassenPointer auf die Methode der Datenklasse und erzeuge wieder unterschiedliche Objekte.

Kurz gesagt, ich bin zur Zeit ratlos, wie ich das Anpacken muss. In den Büchern die ich habe, wird alles nur an simplen Beispielen erklärt, die auf die komplexeren Probleme nicht mehr anwendbar sind und ich habe als armer Student nicht das Geld mir neue Bücher zu kaufen, in der Hoffnung, dass das irgendwo mal erklärt wird. Daher hoffe ich, dass ein erfahrener Programmierer Licht ins Dunkel bringen kann.

Gruß und Dank

KK

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich kann in der Headerdatei meiner Hauptprogrammdateien (Programm2.cpp und Programm.h) keine Variablen einer anderen Klasse einbinden, da alle Klassen in der cpp-Datei erst nach der Hauptprogrammdatei stehen müssen.
Warum sollte das nicht gehen? Sag nicht einfach "geht nicht", sag, wo das Problem liegt (siehe meine Signatur). Bekommst du eine Fehlermeldung? Wenn ja, wie lautet die?

Außerdem brauchst du für einen Zeiger- oder Referenzmember keine vollständige Klassendefinition. Eine Vorwärtsdeklaration tut's auch. Schreib einfach

class CData* NameDerMembervariablen;

in den Definitionen der Page-Klassen.

da das so ist, kann ich keine Variable oder Pointer in der Programm2.h erzeugen, die zum Beispiel, wie in meinem gewollten Fall, auf die Datenklasse zeigen. Wenn ich aber nun den Pointer und die Variable nicht in der Headerdatei unterbringen kann, sondern nur lokal in der cpp-Datei, dann kann ich von den Seiten (Page1, Page2) mit Pointern auf die Hauptprogrammklasse CProgramm2 *Hauptklasse, m_Haupt) nicht auf den Pointer zur Datenklasse zugreifen, weil dieser nicht in der Headerdatei steht. Ich hatte dann als Idee eine neue Klasse zu erzeugen, die ich im Headerlisting vor die Datenklasse setzen kann und die dann den einzigen Pointer zur Datenklasse setzt. Aber dann hüpfe ich von meinen Seitenpointern über den NeuKlassenPointer auf die Methode der Datenklasse und erzeuge wieder unterschiedliche Objekte.

Kurz gesagt, ich bin zur Zeit ratlos, wie ich das Anpacken muss.

Das ist alles viel zu kompliziert. Du ziehst die richtigen Schlüsse aus falschen Beobachtungen.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Holzkopp,

ich habe folgende Idee, ich erzeuge in meiner Headerdatei der Hauptklasse den Pointer zur Datenklasse:

Programm2.h


...

class CProgramm2App : public CWinApp

{

public:

	CProgramm2App();

	class CData *pData;

...

wenn ich die Variable gleich mit deklarieren möchte, sagt er: error C2079: 'mData' verwendet undefiniertes class 'CData' also deklariere ich mData in der cpp-Datei vom Hauptprogramm: Programm2.cpp

#ifdef _AFXDLL

	Enable3dControls();			

#else

	Enable3dControlsStatic();	

#endif



	CProgramm2Dlg Dialog1;

	CDialog2 Dialog2;


	CParent ParentSheet("Test");


	CData m_Daten;

	pData=&m_Daten;


	ParentSheet.AddPage(&Dialog1);

	ParentSheet.AddPage(&Dialog2);


	m_pMainWnd = &ParentSheet;

	int nResponse = ParentSheet.DoModal();

	if (nResponse == IDOK)

	{

	}

	else if (nResponse == IDCANCEL)

	{

	}

return FALSE;

}

Ich möchte nun in meinen Seitenklassen Pointer zur Hauptklasse setzen: Programm2Dlg.h: (der Dialog dieser Klasse ist die erste Seite in meinem Programm)

class CProgramm2Dlg : public CPropertyPage

{


public:

	CProgramm2Dlg(CWnd* pParent = NULL);	// Standard-Konstruktor


	CProgramm2App *pProg,m_Prog;


	protected:

	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV-Unterstützung




protected:

	HICON m_hIcon;



	virtual BOOL OnInitDialog();

	afx_msg void OnPaint();

	afx_msg HCURSOR OnQueryDragIcon();


	DECLARE_MESSAGE_MAP()

};

Einen Pointer (*pProg) auf die Hauptklasse kann ich so erzeugen, bei der Variablen (m_Prog) sartet er das Programm gar nicht erst sondern sagt: Debug assertion failed!

Letzendlich möchte ich dann über den Pointer auf die Hauptklasse mit dem dort vorhandenen Pointer auf die Datenklasse Zugriff zu den Methoden der Datenklasse erhalten. Wenn ich das so bei allen Seiten mache, wäre dann sichergestellt, dass ich von allen Seiten auf alle Daten der Datenklasse zugreifen kann?

Gruß

KK

Link zu diesem Kommentar
Auf anderen Seiten teilen

wenn ich die Variable gleich mit deklarieren möchte, sagt er:

error C2079: 'mData' verwendet undefiniertes class 'CData'

also

HALT! Nicht "also"! Ab hier läuft's schon falsch. Erstens ist es sinnlos, in der App-Klasse einen Zeiger auf die Datenklasse anzulegen. Zweitens: Fang doch nicht immer gleich mit irgendwelchen wilden Workarounds an, nur weil etwas nicht gleich funktioniert. Beim geringsten Problem rennst du in irgendeine Richtung los und wirfst ziellos mit Code um dich. So kommst du auf keinen grünen Zweig.

Zeig den Code, der die obige Fehlermeldung erzeugt. "gleich mit deklarieren" hilft nicht weiter.

Aber ich denke, wir sollten das jetzt mal richtig machen. Jetzt wird erst mal geplant.

Welches Objekt "besitzt" das Datenobjekt, d.h. von wessen Lebenszeit ist das Datenobjekt abhängig?

Welche Objekte benötigen Verweise auf das Datenobjekt, beeinflussen aber nicht seine Lebensdauer?

Wenn du diese Fragen nicht ganz klar beantworten kannst, solltest du keine einzige Zeile Code erzeugen, denn dann bist du mit der Planung noch gar nicht fertig.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Holzkopp,

@Fehlermeldung:


...

class CProgramm2App : public CWinApp

{

public:

	CProgramm2App();

	class CData *pData,mData;

...

Dann erscheint die Fehlermeldung: 'mData' verwendet undefiniertes class 'CData', nur zur Info

1. Das Datenobjekt ist von der Lebensdauer der Hauptprogrammklasse abhängig, da ich im gesamten Verlauf des laufenden Programms auf die Datenklasse zugreifen möchte. Die Lebensdauer des Datenobjekts soll mit Programmende erlöschen.

2. Alle Seiten (PropertyPages) benötigen Verweise auf die Datenklasse, damit ich die Methoden in der Datenklasse aufrufen kann, sollen aber keinen Einfluss auf seine Lebensdauer haben.

Nur nochmal zur Erinnerung, ich kann zur Zeit Daten, die von der einen Seite in die Datenklasse eingetragen werden auch wieder auslesen. Ich kann nur keine Daten auslesen, die von einer anderen Seite eingetragen wurden. (Jede Seite ruft unterschiedliche Methoden in unterschiedlichen Feldern der Datenklasse auf).

Ich hoffe ich habe Deine Anfragen richtig verstanden.

Gruß

KK

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dann erscheint die Fehlermeldung: 'mData' verwendet undefiniertes class 'CData', nur zur Info
Dann fehlt in dieser Datei die Includedirektive für die Datenklasse. Auch nur zur Info.

1. Das Datenobjekt ist von der Lebensdauer der Hauptprogrammklasse abhängig, da ich im gesamten Verlauf des laufenden Programms auf die Datenklasse zugreifen möchte.
Gut. Dann sollte deine App-Klasse einen CData-Member haben (keinen Zeiger).

2. Alle Seiten (PropertyPages) benötigen Verweise auf die Datenklasse, damit ich die Methoden in der Datenklasse aufrufen kann, sollen aber keinen Einfluss auf seine Lebensdauer haben.
Dann braucht jede Propertypage-Klasse einen CData*-Member. Der muss beim Erzeugen der Propertypage-Objekte auf die Adresse des App-Members gesetzt werden. Da du vermutlich ein globales Objekt der App-Klasse hast, sollte es nicht weiter schwer sein, da ranzukommen.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Gut. Dann sollte deine App-Klasse einen CData-Member haben (keinen Zeiger).

1. Fall:

Wenn ich in der App-Klasse eine CData-Member haben möchte, so muss doch die Data.h vor der Programm2.h eingebunden werden, damit er die Klasse kennt.

Wenn ich das tue, meldet mir der Compiler jedoch:

error C2065: 'IDD_DIALOG1' : nichtdeklarierter Bezeichner

error C2057: Konstanter Ausdruck erwartet

(Ich habe als Basisklasse der Datenklasse einfach mal die Dialogklasse genommen)

2.Fall:

Wenn ich, wie du in einem Deiner Vorposts sagtest, eine Vorwärtsdeklaration durchführe mit "class CData m_Data;" dann kommt die Fehlermeldung mit der undefinierten Klasse CData.

Aber jetzt mal rein zum Verständnis. Wenn ich in der App-Klasse eine CData-Member habe, so hat diese Member eine Adresse. Wenn ich nun in meinen Pageklassen jeweils den erstellten Pointer der Datenklasse diese Adresse zuweise, so gehe ich immer auf dem selben Weg in die Datenklasse. Habe ich das so richtig verstanden?

Gruß

KK

Link zu diesem Kommentar
Auf anderen Seiten teilen

1. Fall:

Wenn ich in der App-Klasse eine CData-Member haben möchte, so muss doch die Data.h vor der Programm2.h eingebunden werden, damit er die Klasse kennt.

Nein. Wie kommst du darauf?

Du kannst die Data.h in Programm2.h einbinden.

Wenn ich, wie du in einem Deiner Vorposts sagtest, eine Vorwärtsdeklaration durchführe mit "class CData m_Data;" dann kommt die Fehlermeldung mit der undefinierten Klasse CData.
Ich habe auch geschrieben, dass eine Vorwärtsdeklaration reicht, wenn du nur einen Zeiger oder eine Referenz hast. Das ist hier nicht der Fall.

Aber jetzt mal rein zum Verständnis. Wenn ich in der App-Klasse eine CData-Member habe, so hat diese Member eine Adresse. Wenn ich nun in meinen Pageklassen jeweils den erstellten Pointer der Datenklasse diese Adresse zuweise, so gehe ich immer auf dem selben Weg in die Datenklasse. Habe ich das so richtig verstanden?
Genau.
Link zu diesem Kommentar
Auf anderen Seiten teilen

ok, wenn ich Data.h in die Programm2.h eintrage:

Programm2.h:

#include "Data.h"

...

, dann brauche ich doch Data.h nicht mehr in der Programm2.cpp Datei einzubinden, oder? Sie wird doch doch beim Eintragen der Programm2.h miteingetragen.

Zur Zeit sieht darüber hinaus meine Data.cpp so aus:

#include Programm2.h

#include Data.h

Wenn CData eine Member Programm2 sein soll, kriege ich hier auch ein Problem, oder?

Und zum letzten Punkt, mir fällt irgendwie kein Weg ein, wie ich an die Adresse der CData-Member rankommen sollte, da sie in einer anderen Klasse ist. Mit:

PageX.h:

CProgramm2App *Bezug, m_Bezug;

und dann

PageX.cpp:

Bezug=&m_Bezug.m_Data;

ist das wohl nicht getan, oder?

Gruß

KK

Link zu diesem Kommentar
Auf anderen Seiten teilen

, dann brauche ich doch Data.h nicht mehr in der Programm2.cpp Datei einzubinden, oder? Sie wird doch doch beim Eintragen der Programm2.h miteingetragen.
Richtig.

Zur Zeit sieht darüber hinaus meine Data.cpp so aus:

#include Programm2.h

#include Data.h

Wenn CData eine Member Programm2 sein soll, kriege ich hier auch ein Problem, oder?

Nein. Die Includewächter (#ifndef/#define/#endif) in jeder Headerdatei schützen dich vor Mehrfachincludes.

Und zum letzten Punkt, mir fällt irgendwie kein Weg ein, wie ich an die Adresse der CData-Member rankommen sollte, da sie in einer anderen Klasse ist. Mit:

PageX.h:

CProgramm2App *Bezug, m_Bezug;

Warum erstellst du eigentlich immer einen Zeiger und ein Objekt?

und dann

PageX.cpp:

Bezug=&m_Bezug.m_Data;

ist das wohl nicht getan, oder?

Nein, dann hast du einen Zeiger auf das Objekt, das du da erstellt hast. Das hat mir dem eigentlichen App-Objekt nichts zu tun. Dasselbe Problem, das du auch ursprünglich hast.

Sind CProgramm2Dlg und CDialog2 deine Propertypage-Klassen? Dann hast du doch da alles, was du brauchst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...