Information-hiding struct



  • Guten Morgen Leute,

    ich habe folgendes Konstrukt, ich möchte Foo für die Außenwelt versteckt halten. Was ich wie folgt mache:

    foo.h

    struct foo; //Forward decl.
    
    void do(struct foo* pFoo);
    

    foo.c

    struct foo
    {
        int x;
    };
    
    void do(struct foo* pFoo)
    {
     pFoo->X =42;
    }
    

    nun aber dachte ich mir ich mache foo als typedef

    typedef  struct foo
    {
        int x;
    } foo;
    

    aber für die forward decl. geht das ja nicht , bzw. 2 mal das selbe typdef.. wie löse ich das?;)

    Danke für euere Beiträge:)



  • Ich kenne das so, dass man dem Strukturnamen einen Präfix gibt, zB. tag:

    struct tagFoo;
    

    und

    typedef struct tagFoo
    {
    } Foo;
    

    Ist natürlich etwas doof, da du in der Header-Datei noch mit dem tagFooarbeiten musst, ich weiß nicht, ob man da schon einen typedef auf den konkreten Typen machen darf/kann.



  • @DocShoe sagte in Information-hiding struct:

    Ich kenne das so, dass man dem Strukturnamen einen Präfix gibt, zB. tag:

    struct tagFoo;
    

    und

    typedef struct tagFoo
    {
    } Foo;
    

    Ist natürlich etwas doof, da du in der Header-Datei noch mit dem tagFooarbeiten musst, ich weiß nicht, ob man da schon einen typedef auf den konkreten Typen machen darf/kann.

    ok danke, ich probier das mal aus;) danke dir



  • Lustig, bin gerade zufällig per Reddit auf diesen Artikel gestoßen: The C Programming Language: Myths and Reality (1): C has no equivalent to “private”



  • @Th69 sagte in Information-hiding struct:

    Lustig, bin gerade zufällig per Reddit auf diesen Artikel gestoßen: The C Programming Language: Myths and Reality (1): C has no equivalent to “private”

    Super, das is interessant, danke 🙂 Für alle die den Artikel nicht gelesen haben hier ein ausschnitt:

    So, in the header you do:

    typedef struct StringBuilder StringBuilder;
    
    void Append(StringBuilder *obj, const char *snippet);
    

    In the implementation you do:

    struct StringBuilder {
       char *payload;
    };
    
    void Append(StringBuilder *obj, const char *snippet)
    {
       ...
    }
    

    And … that’s it!


Log in to reply