2016-11-22 3 views
1

Ich habe die folgenden Dateien Struktur, die die Definition einer Struktur einen einkapselnden Typ enthalten, wenn ich versuche, auf ein Mitglied der Struktur zugreifen, bekomme ich die Member access into incomplete type Fehler. Was ist das Problem?Mitglied Zugriff in unvollständigen Typ Fehler

foo_encoder.c:

#include "foo.h" 
//... 
struct FooEncoder { 
    int A; 
    int B; 
    foo_int32 C; 
    //... 
} 

foo.h:

extern "C" { 
    typedef struct FooEncoder FooEncoder; 
    //... 
} 

foo_interface.h:

typedef struct MyFooEncInst FooEncInst; 

foo_interface.cc:

#include "foo_interface.h" 
#include "foo.h" 
//... 
struct MyFooEncInst { 
    FooEncoder* encoder; 
}; 
//... 
MyFoo_Encode(FooEncInst* inst,...) { 
//... 
    if (d > inst->encoder->C) { // This is where I get the error 
//... 
} 

foo_int32 wird an anderer Stelle definiert sind.

+0

foo_encoder.c in den Code einfügen und es wird funktionieren. Lass es mich danach wissen und werde die volle Antwort geben. Eine andere Möglichkeit besteht darin, die vollständige Definition von struct FooEncoder in der neuen .h-Datei zu machen und sie einzuschließen. – Nick

+0

Sie versuchen auf einen Member einer Variablen vom Typ 'MyFooInst *' zuzugreifen. In dem von Ihnen angegebenen Code gibt es jedoch keine Definition des Typs MyFooInst. – sigy

Antwort

1

Sie fragen nach einem Mitglied in der FooEncoder Struktur, die nirgends in Ihrer foo_interface.cc Datei sichtbar ist. Dies ähnelt einem pimpl idiom.

Um Ihren Code bewusst FooEncoder ‚s Struktur, die Sie

#include "foo_encoder.c" 

in Ihrer foo_interface.cc Datei entweder müssen (ich ganz ich diese Lösung nicht gefällt und Sie nicht veröffentlichen der vollständige Code entweder) oder verschieben Sie Ihre Strukturdefinition woanders in eine Headerdatei und schließen Sie diese ein (empfohlen).

2

foo.h deklariert eine Typdefinition zu einer Struktur, die nur in foo.c definiert ist, so dass foo_interface.cc keine Sichtbarkeit darüber hat, was FooEncoder eigentlich ist. Sie können dies beheben, indem Sie die Strukturdefinition von foo_encoder.c nach foo.h verschieben.

0

Der Typ, auf den Sie zugreifen möchten, ist nur für den Zeitpunkt deklariert, an dem Sie versuchen, darauf zuzugreifen. Sie können sich diese question to learn what a forward declaration is ansehen, während answers to this questions erklären, wann Sie eine Forward-Deklaration verwenden können und wann nicht.

Ihre typedef in foo.h wirken grundsätzlich als Vorwärtsdeklaration für Typ FooEncoder. Sie fügen die Datei in foo_interface.cc. Der Compiler weiß also, dass die Typen existieren aber es weiß nichts über seine Interna, wie die Mitglieder es hat. Daher weiß es nicht, ob es ein Mitglied gibt C wie Sie es für den Zugriff anfordern. Sie müssen dem Compiler mitteilen, wie MyFooEncInst und FooEncoder intern aussehen, damit er auf alle Mitglieder zugreifen kann.

Verwandte Themen