globale struktur (im modul definiert, und dennoch in der main() bekannt !!
-
Also extern verhilft einem nicht dazu eine Variable in deinem main anzulegen, sondern sagt nur das man eine extern schon angelegte Variable benutzen kann.
Wenn ich dein Problem richtig verstanden haben dann solltest du das volgendermassen machen:
f.h
struct Meinestruktur; dateieinlesen(Meinestruktur[]); feldsortieren(Meinestruktur[]); feldausgeben(Meinestruktur[]);
Die Sache hier nennt sich Deklaration
f.cpp
struct Meinestruktur{ int x; int y; } dateieinlesen(Meinestruktur[]){ ... } feldsortieren(Meinestruktur[]){ ... } feldausgeben(Meinestruktur[]){ ... }
Das ist die Definition, die wohl oder uebel ja irgendwo bekannt sein muss, so aber halt nicht in der .h, aber wenn du die irgendwann nur als Objekt File zur Verfuegung hast dann reicht es, und keiner sieht mehr deine Implementierung.
Dann kannst du:
main.cpp#include "f.h" int main(){ meinestruktur feld[500]; dateieinlesen(feld); feldsortieren(feld); feldausgeben(feld); return 0; }
Musst dann allerdings beim linken die Objekt oder die .cpp Datei von f angeben.
Gruß
Entyl Sa
-
virtuell Realisticer schrieb:
Export? Das ist mir aber ganz neu.
Irgendwer hat schon gezeigt wie du das erreichen kannst, was du willst. Du
deklarierst in einer Headerdatei deine Struktur als extern und in einer
Implementationsdatei machst du dann die Strukturdeklaration.@tobidope: Bitte doch etwas freundlicher, es war ja klar was gemeint war. wir
wolln doch net gleich jeden verkraulen.mfg
v RNein, ich habe ihm die Lösung zu seinem Problem genannt. Anders geht es nicht. Ansonsten muss er die Programmiersprache wechseln. Er wird ein Struktur ohne Deklaration nicht verwenden können.
-
@Entyl_Sa
meinestruktur feld[500]; in der main geht so nicht,
da er ja die grösse der struct nicht kennt kann er dieses array nicht anlegen, als folge kommt ein kompilerfehlermöglich ist z.b. das folgende:
f.h:
#ifndef F_H #define F_H struct Meinestruktur; struct Meinestruktur* feldanlegen(int count); void feldzerstoeren(struct Meinestruktur *feld); void feldeinlesen(struct Meinestruktur *feld); void feldsortieren(struct Meinestruktur *feld); void feldausgeben(struct Meinestruktur *feld); #endif
f.cpp:
#include "f.h" struct Meinestruktur { int x; int y; }; struct Meinestruktur* feldanlegen(int count) { struct Meinestruktur *feld = 0; // .... return feld; } void feldzerstoeren(struct Meinestruktur *feld) { // .... } void feldeinlesen(struct Meinestruktur *feld) { // .... } void feldsortieren(struct Meinestruktur *feld) { // .... } void feldausgeben(struct Meinestruktur *feld) { // .... }
main.cpp:
#include "f.h" void main(void) { struct Meinestruktur *feld; feld = feldanlegen(500); feldeinlesen(feld); feldsortieren(feld); feldausgeben(feld); feldzerstoeren(feld); }
-
Jetzt stellt sich nur noch eine Frage, was für einen Sinn hat das ganze?
-
kapselung
die implementierung dieses modules kann völlig unabhängig vom rest des programms verändert, erweitert, .... werden (solange sich die public funktionen nicht verändern), und dies ohne, das eine neu-kompilation der anderen module nötig ist
-
warum fragst du eigentlich?
dein genanntes "Pimpl Idiom" geht doch unter anderem auch in diese richtung
-
bozo schrieb:
warum fragst du eigentlich?
dein genanntes "Pimpl Idiom" geht doch unter anderem auch in diese richtung
Deshalb wundere ich mich ja, es gibt funktionierende, dokumentierte und allgemein bekannte Alternativen. Wieso sollte man es anders machen?
-
diese methode ist doch auch funktionierend, dokumentiert und allgemein bekannt
und auch noch länger im gebrauch, da sie schon in c benutzt wurdees gibt nun mal nicht nur eine möglichkeit etwas zu tun, oft sind es mehrere, z.b. kann man auch statt des pointers im obrigen beispiel einen index benutzen
warum man etwas anders machen sollte? weil es jenach genauem anwendungsfall einige unterschiede gibt, und nicht immer alle lösungsvarianten gleich gut passen
(
nicht so ernst zu nehmende antwort wäre ->warum sollte man c++ nutzen, es gibt doch c, warum c, es gibt doch asm, .....
warum sollte man ...... (kannst etwas einsetzen), es gibt doch .....)
-
Aber wenn man C will, sollte man auch nicht unbedingt C++ nutzen. Berichtige mich, aber auf x und y kann er in obiem Beispiel nicht zugreifen, oder?
-
ja und nein
kommt drauf an von wo du diesen zugriff meinst:
in main.c kann man nicht auf die daten in der struct zugreifen, was ja auch der sinn für diese lösung ist, nur in f.cpp kann man auf die daten in der struct zugreifen, und nur dort gehört ja auch der direkte zugriff auf die daten in der struct hin
-
kapselung
die implementierung dieses modules kann völlig unabhängig vom rest des programms verändert, erweitert, .... werden (solange sich die public funktionen nicht verändern), und dies ohne, das eine neu-kompilation der anderen module nötig ist
Das ist nicht Kapselung sondern Functionoverheat. Jedes mal wenn du einen Wert in der Structur verändern willst musst du eine ganze Funktion aufrufen. Ist dir es wirklich so wichtig die 2 int zu verkapseln?
und auch noch länger im gebrauch, da sie schon in c benutzt wurde
Die extern Methode ist eine C Methode die C++ compatible ist.
warum sollte man c++ nutzen, es gibt doch c, warum c, es gibt doch asm, .....
warum sollte man ...... (kannst etwas einsetzen), es gibt doch .....Warum sollte man sich das Leben leicht machen, wenn es auch schwer geht?
in main.c kann man nicht auf die daten in der struct zugreifen, was ja auch der sinn für diese lösung ist, nur in f.cpp kann man auf die daten in der struct zugreifen, und nur dort gehört ja auch der direkte zugriff auf die daten in der struct hin
Vielleicht ist das die C Weise dies zu tun aber in C++ gibt es dafür private Member und Funktionen. Und da dies ein C++ Forum ist...
-
@Iregendwer
sorry, aber du hast es falsch verstandenDas ist nicht Kapselung sondern Functionoverheat. Jedes mal wenn du einen Wert in der Structur verändern willst musst du eine ganze Funktion aufrufen. Ist dir es wirklich so wichtig die 2 int zu verkapseln?
diese zwei int's sind nur ein beispiel das Entyl_Sa benutzt hatte, und ich habs einfach übernommen,
die sind total unwichtig, waren nur sein beispiel,
es geht im grunde um einen abstrakten datentypen, der gekapselt werden soll, und für den kontextbezogene funktionen definiert werdenDie extern Methode ist eine C Methode die C++ compatible ist.
das mit dem extern ist aber etwas völlig anderes,
da wird eine variable global zugänglich gemacht, was man nun wirklich nur mit bedacht machen sollte, auch wollte er die struct auch erst in der main.cpp benutzen und kein festdefinierte variable in der moduldatei habenWarum sollte man sich das Leben leicht machen, wenn es auch schwer geht?
habe ich denn etwas anderes geschrieben, nein
Vielleicht ist das die C Weise dies zu tun aber in C++ gibt es dafür private Member und Funktionen. Und da dies ein C++ Forum ist..
he?
was hat das damit zu tun, nichts
meine antwort passt einfach auf die in diesem thread gestellte frage und um die geht es ja wohl, es geht hier nicht um private member und funktionen, sondern darum das die struct nicht gloabal (in dem header) genau deklariert werden soll
-
he?
was hat das damit zu tun, nichts
meine antwort passt einfach auf die in diesem thread gestellte frage und um die geht es ja wohl, es geht hier nicht um private member und funktionen, sondern darum das die struct nicht gloabal (in dem header) genau deklariert werden sollEs geht darum ein struct in einem module zu definiren (definiren!=declariren) und es in einem anderen Module zugänglich zu machen, das ist für mich eindeutig die extern Methode, von Kapselung war nie die Rede.
Desweiteren wenn man in C++ Variablen einer struct für den Endprogrammirer unzugänglich machen will dann benutzt man private. Die Memberfunctionen werden in ein separates Modul gepackt. Und wenn man seine struct (was inzwischen schon eine class ist) verändern will dann verändert man sie im Header denn wenn man die neue benutzen will muss man eh den neuen Header benutzen.
-
Irgendwer schrieb:
he?
was hat das damit zu tun, nichts
meine antwort passt einfach auf die in diesem thread gestellte frage und um die geht es ja wohl, es geht hier nicht um private member und funktionen, sondern darum das die struct nicht gloabal (in dem header) genau deklariert werden sollEs geht darum ein struct in einem module zu definiren (definiren!=declariren) und es in einem anderen Module zugänglich zu machen, das ist für mich eindeutig die extern Methode, von Kapselung war nie die Rede.
Desweiteren wenn man in C++ Variablen einer struct für den Endprogrammirer unzugänglich machen will dann benutzt man private. Die Memberfunctionen werden in ein separates Modul gepackt. Und wenn man seine struct (was inzwischen schon eine class ist) verändern will dann verändert man sie im Header denn wenn man die neue benutzen will muss man eh den neuen Header benutzen.
Du weißt wirklich nicht so ganz genau, was extern bedeutet, oder?
-
genau tobidope
Irgendwer, du unterliegst einem irrtum
schau doch einfach noch mal in die post's von xdsmpDS, er schrieb zwar etwas von definieren, aber durch die nachfolgenden aussagen wird ganz klar deutlich was er will
...ahso ich will die struktur auch auf keinen fall in der .h definieren !! jedenfalls nicht so das man dort etwas über ihren aufbau erkennen könnte !...
und genau darum geht es in diesem thread!
was du mit deinem extern machen willst ist etwas völlig anderes!
und deine sache mit der class und private passt hier einfach auch nicht, hier ist eine ganz andere zielsetzung gefragt worden!
z.b. ist es eben möglich die daten in der struct zu verändern ohne das der header verändert wird und alle dateien die diesen header benutzen neu kompiliert werden müssenschau dir einfach noch mal die post's in diesem thread genau an,
dann sollte es dir eigentlich klar werden, um was es hier geht und was der unterschied zu deinem jeweils geschriebenen ist
-
Du hast auch nicht so ganz genau gelesen, was ich sagte. Mir ging es darum, das er denn Beriff extern falsch verwendet. Mir ist schon klar was er letztenendes bezweckt, doch der scopeidentifier extern hat damit nun mal gar nichts zu tun. Ich habe bisher überhaupt nichts von extern gesagt.
-
der sinn ?
naja es gibt in c++ ja die möglichkeit module zu kapseln
das heißt das man die module zB auch getrennt von der main compelieren kann !
zudem kann es fälle geben wo man bestimmte lösungen geheim halten will, also auch eine spezielle struktur !warum ich das feld mit der unbekannten struktur als über die main schiebe ?
naja hab wohl zu lange MS VB6.0 geprogged *g*
kanns nun mal net mehr andersund danke für die vielen antworten ! werd mich nach de feiertagen noch mal damit beschäftigen ! :xmas1: :xmas2: :xmas2: :xmas2: