2012-03-31 1 views
1

Ich habe eine Menge zu lesen bei der Weitergabe eines Strukturelements an eine Funktion. Aber wenn jemand klären könnte, wo ich falsch liege, würde ich es begrüßen. Ich sage voraus, das ist mehr ein Kompilierreihenfolge/Definitionsfehler als alles andere, obwohl es auch Syntaxfehler geben kann.C++ Struct-Werte von Funktion durch Referenz ändern (möglicherweise kompilieren Bestellungsproblem)

Wie ich es verstehe, ich bin in der Lage, die Struktur Mitglieder Daten zu ändern, und vermeiden Sie kopieren durch Übergabe als Referenz (in diesem Fall kein Zeiger). Diese Methode ermöglicht es mir auch, die punktierte Schreibweise für den Zugriff auf einzelne Mitglieder innerhalb der Funktion beizubehalten.

Main.cpp:

// include headers 
struct foo{ 
    int a; 
    int b; 
}foo_data; 

int main(){ 
    foo_data.a = 1; // assign some values to the member in standard format. 
    foo_data.b = 2; 

    function(foo_data); 
    // should this be &foo_data, am I passing by value here as it is 
    // or is the declaration taking care of that? 
} 

functions.h:

void function(foo &) // function declaration reference of type foo 

functions.cpp:

void function(foo &foo_data) // function definition reference of type foo 
{ 
    foo_data.a; // should == 1 
    foo_data.b; // should == 2 
} 

Die Fehler typischerweise undeclared Identifikatoren beziehen, foo_data ist. Muss ich sagen, die Deklaration in functions.h ich gebe es eine Struktur, oder in der Tat eine int (Referenz?)

Vielen Dank!

Antwort

1

Root Cause:
Sie erhalten den Fehler, da Compiler nicht wissen/verstehen den Typ foo, die Sie in Ihrer CPP-Datei verwenden. Er kann den Typ nur kennen, wenn er seine Definition sieht.

Lösung:
Sie müssen die Erklärung der Struktur in einer Header-Datei setzen und schließen, dass die Header-Datei sowohl in der Kopfzeile, wo Sie die Funktion und die CPP-Datei angeben, wo Sie sie definieren.

functions.h

struct foo{ 
int a; 
int b; 
}; 
extern foo foo_data; 
void function(foo &); 

functions.cpp

#include "functions.h" 
foo foo_data; 


void function(foo &foo_data) function definition reference of type foo 
{ 
    //access local foo_data 
    foo_data.a // should = 1 
    foo_data.b // should = 2 

    //access global foo_data 
    ::foo_data.a = 1; 
    ::foo_data.b = 1; 
} 

Main.cpp

#include "functions.h" 

int main() 
{ 
    //Global foo_data is accessible here now 
    foo_data.a = 
    foo_data.a = 
    .... 
} 

EDIT:
Anmerkungen vorschlagen, dass Sie eine foo_data Instanz über mehrere Quelldateien teilen möchten, in diesem Fall sollten Sie extern verwenden, modifizierte ich den obigen Beispielcode so zu tun, beachten Sie, dass innerhalb function() die lokale foo_data Instanz die verstecken globale Instanz und wenn Sie das globale Objekt verwenden möchten, müssen Sie es als ::foo_data verwenden.

+0

Hallo, es war in der Tat ein Design-Problem, das Verschieben der Struktur in die .h-Datei und das Umordnen beinhaltet, es zu kompilieren. Ich habe jetzt einen Link-Fehler in Bezug auf die Struktur bereits in main.obj - Nach der Suche habe ich festgestellt, dass dies auf mehrere CPP-Dateien beziehen kann nicht die gleiche Instanz verwenden. Wenn ich "statische Struktur" in meinen .h-Arbeiten zuweise, kann ich diese Struktur global machen? "extern" verursacht ähnliche Fehler und ist dies sogar die beste Vorgehensweise? Vielen Dank! –

+0

@ChrisJones: Wenn Sie das gleiche globale Objekt über verschiedene Dateien teilen müssen, dann müssen Sie 'extern' verwenden, ich sehe nicht, wo Sie eine globale obwohl verwenden. –

+0

Hallo, wenn meine Header-Datei in ENTWEDER main.cpp, OR functions.cpp enthalten ist, dann kompiliert und verbindet es. Wenn es in beiden Dateien enthalten ist, bekomme ich den folgenden Link Fehler: functions.obj: Fehler LNK2005: "struct Foo foo_data" (? Foo_data @@ 3UFoo @@ A) bereits in main.obj definiert - ich schließe meine ein. h unmittelbar nach dem Vorkompilieren beinhaltet. –

1

Die Klassendefinition für foo muss sowohl für main als auch für function sichtbar sein.Machen Sie es wie folgt aus:

// File foo.hpp 

struct foo { int a; int b; }; 
void function(foo &); 

// File main.cpp 

#include "foo.hpp" 

int main() 
{ 
    foo foo_data; 
    foo_data.a = 1; 
    function(foo_data); 
} 

// File foo.cpp 

#include "foo.hpp" 

void function(foo & x) 
{ 
    // use x.a, x.b etc. 
} 

Wenn Ihr function muss nur die Werte zu lesen, können Sie es mit einem foo const & Argument erklären.

Verwandte Themen