Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Advanced Developers Conference     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: C (C89 und C99) ::  Wie wird in C gekapselt?  
Gehen Sie zu Seite 1, 2, 3 ... 11, 12, 13  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
cppfrager
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.07.2010
Beiträge: 77
Beitrag cppfrager Mitglied 17:55:52 20.08.2010   Titel:   Wie wird in C gekapselt?            Zitieren

Hallo liebe C-Gemeinde,

ich lerne zwar C++ aber mich würde mal interessieren wie ihr denn in C eure Daten und Funktionen dazu kapselt? Macht ihr das nur über Namenpre- oder postfixe oder wie haltet ihr die vielen Funktionen auseinander, ich glaube es gibt ja nicht mal Namensräume oder?

_________________
Nicht gleich hauen, ich bin noch C++ Frischling und habe daher ein Recht auf Welpenschutz ;-)
/rant/
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.10.2008
Beiträge: 1527
Beitrag /rant/ Mitglied 18:15:56 20.08.2010   Titel:              Zitieren

Richtig, es gibt keine Namensräume. Das letzte mal, als ich wirklich reines C programmiert habe, habe ich mit Präfixen arbeiten müssen; dabei habe ich allerdings eine Art OOP genutzt, bei dem die Funktionen als Zeiger in structs zur Verfügung gestellt wurden...

_________________
MCP, MCTS and more! | "It's 7:05am. I have not slept." | www.google.com
Tim
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.11.2004
Beiträge: 6771
Beitrag Tim Mitglied 19:14:41 20.08.2010   Titel:              Zitieren

/rant/ schrieb:
dabei habe ich allerdings eine Art OOP genutzt, bei dem die Funktionen als Zeiger in structs zur Verfügung gestellt wurden...

Das hat mit OOP eigentlich nichts zu tun. Das ist nur Resourcen verschwendet. Es ist lediglich Syntax-Zucker, denn ob man nun...
C/C++ Code:
object.method(par);
C/C++ Code:
object.method(par);
C/C++ Code:
object.method(par);

oder...
C/C++ Code:
method(object, par);
C/C++ Code:
method(object, par);
C/C++ Code:
method(object, par);

schreibt...

_________________
Vorsicht, dieser Benutzer ist manisch-depressiv oder schizoid!
Professionell diagnostiziert durch Internet-Hobby-Psychologen
blub blub
Unregistrierter




Beitrag blub blub Unregistrierter 20:00:07 20.08.2010   Titel:              Zitieren

Wenn ich mit C Libs arbeite bspw. die GNOME-Libraries, sind diese öfters so aufgebaut:

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct privObjekt // Darf nur intern von der Library benutzt werden.
{
   // Attribute
};

struct Objekt // Darf nur vom Kunden angewendet werden.
{
   privObjekt priv; // Darf nur von der Library intern benutzt werden.
   // Attribute die der Kunde benutzen darf.

   int x;
   int y;
   double width;
   double height;
};
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct privObjekt // Darf nur intern von der Library benutzt werden.
{
// Attribute
};

struct Objekt // Darf nur vom Kunden angewendet werden.
{
privObjekt priv; // Darf nur von der Library intern benutzt werden.
// Attribute die der Kunde benutzen darf.

int x;
int y;
double width;
double height;
};
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct privObjekt // Darf nur intern von der Library benutzt werden.
{
   // Attribute
};

struct Objekt // Darf nur vom Kunden angewendet werden.
{
   privObjekt priv; // Darf nur von der Library intern benutzt werden.
   // Attribute die der Kunde benutzen darf.

   int x;
   int y;
   double width;
   double height;
};



Und in der Dokumentation wird nur dieser Teil erwähnt und erklärt:

C/C++ Code:
struct Objekt
{
    int x;
    int y;
    double width;
    double height;
};
C/C++ Code:
struct Objekt
{
int x;
int y;
double width;
double height;
};
C/C++ Code:
struct Objekt
{
    int x;
    int y;
    double width;
    double height;
};


Die Library zeigt nicht, dass 'Objekt' eine weitere Struktur in sich hat. Sie erwähnt nur, dass man die Struktur 'privObjekt' nicht nutzen sollte.


Meintest du sowas?
Wutz
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.04.2010
Beiträge: 1913
Beitrag Wutz Mitglied 20:02:23 20.08.2010   Titel:              Zitieren

Überlicherweise geschieht eine Kaspelung durch Auslagerung in einzelne C-Module, wo dann über den Speicherklassen-Spezifizierer "static" gesteuert wird, was an Daten/Funktionen nach außen sichtbar ist oder nicht. Zum Einsatz für den dynamischen Zugriff kommen dann u.a. auch Callbacks.

_________________
Java, the best argument for Smalltalk since C++. -- Frank Winkler
DrGreenthumb
Mitglied

Benutzerprofil
Anmeldungsdatum: 07.10.2001
Beiträge: 4623
Beitrag DrGreenthumb Mitglied 20:04:22 20.08.2010   Titel:              Zitieren

Tim schrieb:
/rant/ schrieb:
dabei habe ich allerdings eine Art OOP genutzt, bei dem die Funktionen als Zeiger in structs zur Verfügung gestellt wurden...

Das hat mit OOP eigentlich nichts zu tun. Das ist nur Resourcen verschwendet. Es ist lediglich Syntax-Zucker, denn ob man nun...
C/C++ Code:
object.method(par);
C/C++ Code:
object.method(par);
C/C++ Code:
object.method(par);

oder...
C/C++ Code:
method(object, par);
C/C++ Code:
method(object, par);
C/C++ Code:
method(object, par);

schreibt...


Der Sinn von Funktionszeigern in structs ist auch nicht das man object.method() schreiben kann (müsste in C eh object.method (object) sein), sondern dass man eben die Methoden aufruft, die das Objekt zur Verfügung stellt.
Das ist schon ein wichtiger Aspekt von OOP.

_________________
main(k){for(k=0;k<125;++k)putchar((k+1)%25? ("[k<qFUF>XB]X=9V=hm9FC"[k/6]-52)&1<<k%6?64:32:10);}
supertux
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.07.2004
Beiträge: 3348
Beitrag supertux Mitglied 23:29:10 20.08.2010   Titel:              Zitieren

meine Meinung nach ist das immer noch Syntax-Zucker. Ich mache immer so:

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
typedef struct objA {
 ...
} objA;

objA *objA_create(void);
void objA_free(objA *obj);
int objA_set_xyz(objA *obj, ...);
int objA_do_this(objA *obj);
int objA_do_that(objA *obj);
...

typedef struct objB {
 ...
} objB;


objB *objB_create(void);
void objB_free(objB *obj);
int objB_set_xyz(objB *obj, ...);
int objB_do_this(objB *obj);
int objB_do_that(objB *obj);
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
typedef struct objA {
...
} objA;

objA *objA_create(void);
void objA_free(objA *obj);
int objA_set_xyz(objA *obj, ...);
int objA_do_this(objA *obj);
int objA_do_that(objA *obj);
...

typedef struct objB {
...
} objB;


objB *objB_create(void);
void objB_free(objB *obj);
int objB_set_xyz(objB *obj, ...);
int objB_do_this(objB *obj);
int objB_do_that(objB *obj);
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
typedef struct objA {
 ...
} objA;

objA *objA_create(void);
void objA_free(objA *obj);
int objA_set_xyz(objA *obj, ...);
int objA_do_this(objA *obj);
int objA_do_that(objA *obj);
...

typedef struct objB {
 ...
} objB;


objB *objB_create(void);
void objB_free(objB *obj);
int objB_set_xyz(objB *obj, ...);
int objB_do_this(objB *obj);
int objB_do_that(objB *obj);


da ist auch ganz klar, dass objB_do_that() nur für objB-Objekte gültig ist und vom objB angeboten wird.

_________________
"Computers are like Old Testament gods; lots of rules and no mercy" by Joseph Campbell


Zuletzt bearbeitet von supertux am 23:30:55 20.08.2010, insgesamt 1-mal bearbeitet
DrGreenthumb
Mitglied

Benutzerprofil
Anmeldungsdatum: 07.10.2001
Beiträge: 4623
Beitrag DrGreenthumb Mitglied 23:38:14 20.08.2010   Titel:              Zitieren

supertux schrieb:
meine Meinung nach ist das immer noch Syntax-Zucker.


was? funktionszeiger in structs?

_________________
main(k){for(k=0;k<125;++k)putchar((k+1)%25? ("[k<qFUF>XB]X=9V=hm9FC"[k/6]-52)&1<<k%6?64:32:10);}
supertux
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.07.2004
Beiträge: 3348
Beitrag supertux Mitglied 00:35:57 21.08.2010   Titel:              Zitieren

genau

_________________
"Computers are like Old Testament gods; lots of rules and no mercy" by Joseph Campbell
DrGreenthumb
Mitglied

Benutzerprofil
Anmeldungsdatum: 07.10.2001
Beiträge: 4623
Beitrag DrGreenthumb Mitglied 00:54:27 21.08.2010   Titel:              Zitieren

dann hast du auch nicht verstanden wieso da funktionszeiger drin sind. Das hat nichts mit Syntax-Zucker zu tun.

Hier mal ein Beispiel-Ausschnitt wie ich mich in C an OOP versucht habe:

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
struct sexp_type_info {
    const char* name;
    void (*free) (struct sexp*);
    bool (*eq) (struct sexp*, struct sexp*);
    void (*write) (struct sexp*, void (*f) (const char*, void*), void* fx);
    void (*string_rep) (struct sexp*, char* dest, size_t max);
    struct sexp* (*copy) (struct sexp*);
};

struct sexp { // Basisklasse
    struct sexp_type_info* type_info;
};

struct sexp_number_t { // Abgleitet1
    struct sexp exp;
    int number;
};

struct sexp_pair_t { // Abgleitet2
    struct sexp exp;
    struct sexp* first;
    struct sexp* rest;
};

void
sexp_free (struct sexp* e) {  // EDIT: diese funktion ist Syntax-Zucker
    if (e)
        e->type_info->free (e);
}

void
pair_type_free (struct sexp* e) {
    if (e) {
        sexp_free (SEXP_FIRST (e));
        sexp_free (SEXP_REST (e));
        free (e);
    }
}

struct sexp*
sexp_pair (struct sexp* first, struct sexp* rest) {
    static struct sexp_type_info type_info_pair = {
        "PAIR",
        pair_type_free,
        pair_type_eq,
        pair_type_write,
        pair_type_string_rep,
        pair_type_copy,
    };

    struct sexp_pair_t* n = malloc (sizeof (*n));
    if (!n)
        return error (err_out_of_memory);
    n->exp.type_info = &type_info_pair;
    n->first = first;
    n->rest = rest;
    return SEXP (n);
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
struct sexp_type_info {
const char* name;
void (*free) (struct sexp*);
bool (*eq) (struct sexp*, struct sexp*);
void (*write) (struct sexp*, void (*f) (const char*, void*), void* fx);
void (*string_rep) (struct sexp*, char* dest, size_t max);
struct sexp* (*copy) (struct sexp*);
};

struct sexp { // Basisklasse
struct sexp_type_info* type_info;
};

struct sexp_number_t { // Abgleitet1
struct sexp exp;
int number;
};

struct sexp_pair_t { // Abgleitet2
struct sexp exp;
struct sexp* first;
struct sexp* rest;
};

void
sexp_free (struct sexp* e) { // EDIT: diese funktion ist Syntax-Zucker
if (e)
e->type_info->free (e);
}

void
pair_type_free (struct sexp* e) {
if (e) {
sexp_free (SEXP_FIRST (e));
sexp_free (SEXP_REST (e));
free (e);
}
}

struct sexp*
sexp_pair (struct sexp* first, struct sexp* rest) {
static struct sexp_type_info type_info_pair = {
"PAIR",
pair_type_free,
pair_type_eq,
pair_type_write,
pair_type_string_rep,
pair_type_copy,
};

struct sexp_pair_t* n = malloc (sizeof (*n));
if (!n)
return error (err_out_of_memory);
n->exp.type_info = &type_info_pair;
n->first = first;
n->rest = rest;
return SEXP (n);
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
struct sexp_type_info {
    const char* name;
    void (*free) (struct sexp*);
    bool (*eq) (struct sexp*, struct sexp*);
    void (*write) (struct sexp*, void (*f) (const char*, void*), void* fx);
    void (*string_rep) (struct sexp*, char* dest, size_t max);
    struct sexp* (*copy) (struct sexp*);
};

struct sexp { // Basisklasse
    struct sexp_type_info* type_info;
};

struct sexp_number_t { // Abgleitet1
    struct sexp exp;
    int number;
};

struct sexp_pair_t { // Abgleitet2
    struct sexp exp;
    struct sexp* first;
    struct sexp* rest;
};

void
sexp_free (struct sexp* e) {  // EDIT: diese funktion ist Syntax-Zucker
    if (e)
        e->type_info->free (e);
}

void
pair_type_free (struct sexp* e) {
    if (e) {
        sexp_free (SEXP_FIRST (e));
        sexp_free (SEXP_REST (e));
        free (e);
    }
}

struct sexp*
sexp_pair (struct sexp* first, struct sexp* rest) {
    static struct sexp_type_info type_info_pair = {
        "PAIR",
        pair_type_free,
        pair_type_eq,
        pair_type_write,
        pair_type_string_rep,
        pair_type_copy,
    };

    struct sexp_pair_t* n = malloc (sizeof (*n));
    if (!n)
        return error (err_out_of_memory);
    n->exp.type_info = &type_info_pair;
    n->first = first;
    n->rest = rest;
    return SEXP (n);
}

_________________
main(k){for(k=0;k<125;++k)putchar((k+1)%25? ("[k<qFUF>XB]X=9V=hm9FC"[k/6]-52)&1<<k%6?64:32:10);}


Zuletzt bearbeitet von DrGreenthumb am 01:33:00 21.08.2010, insgesamt 2-mal bearbeitet
C/C++ Forum :: C (C89 und C99) ::  Wie wird in C gekapselt?  
Gehen Sie zu Seite 1, 2, 3 ... 11, 12, 13  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.