Hallo!
Ich hab grad vor mit mehreren Personen ein VC++ Projekt zu machen. Dabei sind und 2 Probleme aufgefallen, die wir nicht lösen konnten:
1. wir brauchen in dem MFC-Projekt Variablen, auf die auch Instanzen unserer Klassen zugreifen können - wie machen?
2. Kann man irgendwie auch Resourcen speziell erstellte dialogfelder exportieren, denn jeder arbeitet an verschiedenen und die müssen ja zusammengefügt werden.
Ich würd mich über ne Antwort freuen!
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
hi.
1.) ich glaube da hast du was falsch verstanden. variable greifen auf gar nichts zu, die enthalten daten. dementsprechend greifen die auch nicht auf instanzen euerer klassen zu....
2.) mann kann einfach zwei kopien von vc++ starten, beide projekte laden und dann die dialogbox per zwischenablage kopieren. alternativ kann man zwei .rc dateien anlegen und beide ins projekt einbinden. einer arbeitet dann an der einen .rc datei, der andere an der anderen..
WM_FYI
erst denken, dann schreiben
Danke für die schnelle Antwort, dass man mehrere rc-dateien einbinden kann wußte ich nicht.
Mit den Variablen war anders gemein:
ich brauche sowas wie globale variablen - das problem sieht in etwa so aus:
das programm hat mehrere bearbeitungsmodule - diese greifen aber nicht direkt auf dateien oder das netzwerk zu sondern auf globale variablen (oder sowas ähnliches). Diese wiederrum werden von einem Datenaustausch modul geladen oder wieder gespeichert, so dass sich die einzelnen Module nicht darum oder um Netzwerk kümmern müssen.
Bloß leider krieg ich diese globalen Variablen nicht deklariert.
Immer wenn ich es in der Haupt-Header-Datei probiere, entstehen linker-fehler, da die header-datei ja auch in den entsprechenden modulen geladen wird...
Kannst du mir da vielleicht auch weiterhelfen?
Danke für die schnelle Antwort.
Dass man mehrere rc-dateien einbinden kann wußte ich nicht, werds gleich mal probieren.
Das mit den Variablen war anders gemeint:
Ich brauche so ne Art globale Variablen, so dass auch Instanzen der Klassen auf diese Variablen zugreifen können.
Ich hab versucht Variablen in der Haupt-Headerdatei zu deklarieren, was aber zu linker-fehlern führte, da diese header-datei ja auch in den einzelen Klassen-Quelltext-Dateien eingebunden werden muß(mehrfach-compilierung).
Kannst du mir da weiterhelfen?
im haupt-header-file als extern deklarieren und in genau einem c/cpp file ohne extern und ohne static definieren. Bei gemischter verwendung auf die dekoration achten (oder extern "C"{} verwenden, s.u.)
z.b.:
//header.h
#ifdef __cplusplus
extern "C" {//aber nur bei mischbenutzung c/cpp
#endif
extern int anzahl;
#ifdef __cplusplus
}
#endif
//main.cpp
#include "header.h"
int anzahl;//hier ist die globale variable
//module.cpp
#include "header.h"
//int anzahl;//hier nur als kommentar
mr.escape
Danke an alle!
Das einbinden der Resourcen-Datei hat geklappt und das mit den externen Variablen auch.
Mir stößt das Prinzip der globalen Variablen recht sauer auf. Natürlich ist es bequem, aber nicht sonderlich sauber.
Schöner wäre es doch eine abstrakte Datenzugriffsklasse zu haben mit den implementierungen Netzwerkzugriff und Plattenzugriff.
Entweder übergibst du jetzt jedem Modul eine Referenz auf Datenzugriffsklassse oder du machst weiter mit OOP, was wohl bequemer (und sicherer, besonders beim wechsel der Datenquelle) ist.
Mit einer ModulBasisklasse die einen statischen Pointer auf Datenzugriffsklasse brauchst du nur diesen einen Pointer auf dem neuesten Stand zu halten.Alle Erben der Modulbasisklasse haben damit auch gleich einen aktuellen Pointer auf den Datenzugriff
Vieleicht wirds mit einem Beispiel klarer
class DatenZugriff
{
public:
DatenZugriff(); // Konstruktor
virtual DatenZugriff(); // Destruktor (tilde geht leider bei grad nicht)
DatenTyp1 LeseDatenTyp1() = 0; // abstrakte / pure Methode
}
class Netzwerklesen : public DatenZugriff
{
public:
....// Konstruktor, Destruktor
DatenTyp1 LeseDatenTyp1(); // implementierung in der zugehörigen .cpp datei
}
class FestplatteLesen : public DatenZugriff
{
public:
...// Konstruktor, Destruktor
DatenTyp1 LaseDatenTyp1(); // implementierung, bloß diesmal für Festplatten
}
class MutterAllerModule
{
public:
...// Konstruktor , Destruktor
void NeuerZugriff( DatenZugriff *zugriff); // stellt neuen Zugriff ein, evtl wird hier auch gleich der alte zugriff delete 'd
protected:
static DatenZugriff *zugriff;
}
Alle kinder von "MutterAllerModule" können jetzt jederzeit (solange "zugriff" nicht NULL ist jedenfalls) immer zugriff->LeseDatenTyp1() benützen und müssen sich nicht drum scheren woher die Daten genau kommen. Sie sollten jedoch eine gewisse toleranz gegenüber Langsamen Netzwerkverbindungen usw. mitbringen, aber das ist ein ganz anderes (längeres) Kapitel
Viel Spass