wulfgang Geschrieben 19. Februar 2009 Geschrieben 19. Februar 2009 Hallo, ich möchte gerne einen vector mit strings global für Methoden verschiedener Klassen verfügbar machen. Wie mache ich das?Ein kleines Beispiel, was in der Header-und was in der Sourcedatei steht, wäre hilfreich. Zitieren
Klotzkopp Geschrieben 19. Februar 2009 Geschrieben 19. Februar 2009 Header: extern std::vector<std::string> xyz; Source (irgendeine, egal welche, aber nur eine): std::vector<std::string> xyz; Zitieren
VaNaTiC Geschrieben 19. Februar 2009 Geschrieben 19. Februar 2009 In dem Zusammenhang habe ich eine Frage zum extern. Muss man extern "C++" { ... } das "C++" angeben oder ist das egal? Zitieren
Klotzkopp Geschrieben 19. Februar 2009 Geschrieben 19. Februar 2009 Soweit ich weiß, braucht man das nur, wenn man innerhalb eines extern "C"-Blocks eine Funktion dann doch wieder mit C++-Linkerkonventionen haben will. Zitieren
wulfgang Geschrieben 19. Februar 2009 Autor Geschrieben 19. Februar 2009 Klappt schon fast. Es kommen noch 2 Fehler. 'transfer_data::dateinamen_xar' : illegal storage class error C2071: 'transfer_data::dateinamen_xar' : illegal storage class #pragma once #include <vector> #include <algorithm> using namespace std; class transfer_data { public: transfer_data(void); void exception_handling_Change_Directory(void); extern vector<string> dateinamen_xar; //beide Fehler beziehen sich //auf diese Zeile public: ~transfer_data(void); }; Zitieren
TDM Geschrieben 19. Februar 2009 Geschrieben 19. Februar 2009 Wenn extern, dann nach dem using. Wobei ich eher auf externe/globale Variablen verzichten würde. Implementier es lieber als Funktion in irgendeine Klasse und mach die notfalls static. Edit: const CBR ist natürlich eine sauberere Lösung. Zitieren
Klotzkopp Geschrieben 19. Februar 2009 Geschrieben 19. Februar 2009 Klappt schon fast. Es kommen noch 2 Fehler. Extern als Klassenmember ergibt keinen Sinn. Ein nichtstatischer Member ist niemals global, sondern immer an die Existenz einer Instanz der Klasse gebunden. Zitieren
wulfgang Geschrieben 19. Februar 2009 Autor Geschrieben 19. Februar 2009 Wenn extern, dann nach dem using Funktioniert jetzt! const CBR ist natürlich eine sauberere Lösung. Was meinst du damit? Zitieren
TDM Geschrieben 19. Februar 2009 Geschrieben 19. Februar 2009 Was meinst du damit? Den Vector immer als Parameter übergeben. Bsp: transfer_data::transfer_data(const vector<string>& data) { //... } Zitieren
wulfgang Geschrieben 19. Februar 2009 Autor Geschrieben 19. Februar 2009 int _tmain(int argc, _TCHAR* argv[]) { for(int i=0; i<dateinamen_ar.size(); i++) cout << dateinamen_xar[i]<<"\n"; return 0; } Was muss ich in andere Sourcedateien noch einfügen, damit ich innerhalb von main auf dateinamen_xar zugreifen kann? Zitieren
Klotzkopp Geschrieben 19. Februar 2009 Geschrieben 19. Februar 2009 Was muss ich in andere Sourcedateien noch einfügen, damit ich innerhalb von main auf dateinamen_xar zugreifen kann?Was du in anderen Sourcedateien änderst, hat darauf gar keinen Einfluss. Du brauchst die Deklaration von dateinamen_xar, d.h. eine Includedirektive für den Header, der diese enthält. Und wenn dateinamen_xar immer noch ein Member von transfer_data ist, brauchst du eine Instanz dieser Klasse. Zitieren
wulfgang Geschrieben 19. Februar 2009 Autor Geschrieben 19. Februar 2009 Und wenn dateinamen_xar immer noch ein Member von transfer_data ist, brauchst du eine Instanz dieser Klasse. Wieso? Ich dachte durch extern existiert dateinamen_xar unabhängig von der Klasse. Ein Beispiel, was gemeint ist, würde weiterhelfen. Zitieren
Klotzkopp Geschrieben 19. Februar 2009 Geschrieben 19. Februar 2009 Wieso? Ich dachte durch extern existiert dateinamen_xar unabhängig von der Klasse. Damit ein Member unabhängig von Instanzen der Klasse existiert, benutzt man static. dateinamen_xar kann nicht gleichzeitig extern und Member sein, der Speicherklassenspezifizierer extern ist für Member nicht erlaubt. Es ergibt auch keinen Sinn. Ich weiß nicht, wo du extern hingeschrieben hast, aber solange dateinamen_xar ein nichtstatischer Member von transfer_data ist, gibt es kein dateinamen_xar ohne transfer_data. Ein Beispiel, was gemeint ist, würde weiterhelfen.Zu wissen, wie dein Code jetzt aussieht, würde weiterhelfen. Die letzte Meldung war "Funktioniert jetzt!", aber das stimmt ja offensichtlich nicht. Zitieren
VaNaTiC Geschrieben 19. Februar 2009 Geschrieben 19. Februar 2009 ich denke mit CBR und der anschliessende Parameterdeklaration ist gemeint: call by reference (Aufruf über die Referenz), performanter beim Aufruf der Funktion, da keine Kopie der Datenstruktur angelegt werden muss, sondern nur eine 32/64-bittige Referenz an die Funktion übergeben wird. Gegenstück dazu ist call by value, Vorteil ist, Datenstruktur kann ohne Orginal zu verändern editiert werden. Die gesamten Merkmale erzählt Dir mit Sicherheit wiki oder google Zitieren
wulfgang Geschrieben 20. Februar 2009 Autor Geschrieben 20. Februar 2009 Mit funktioniert jetzt, meinte ich. dass die Klasse an sich keine Fehler mehr verursacht. Ich muss diesen vector irgendwie für andere Klassen und die main verfügbar machen. Aber static ist ja offenbar nicht so gut. Die einzige andere Lösung wäre dann ja den vector als member der Klasse und dann ein Objekt erschaffen, richtig? Zitieren
Klotzkopp Geschrieben 20. Februar 2009 Geschrieben 20. Februar 2009 Mit funktioniert jetzt, meinte ich. dass die Klasse an sich keine Fehler mehr verursacht.Wie dein Code jetzt aussieht, weiß ich aber dadurch immer noch nicht. Ich muss diesen vector irgendwie für andere Klassen und die main verfügbar machen. Aber static ist ja offenbar nicht so gut. Static dient einem bestimmten Zweck. Die Art, wie du es benutzt, ist nicht gut. Du machst irgendwelche Variablen static, extern oder global, um damit deine hausgemachten Designprobleme zu lösen. Das ist nicht Sinn der Sache. Ob eine Variable static oder nicht ist, oder meinetwegen auch global, sollte das Ergebnis einer Designentscheidung sein, und nicht Lösung für ein Zugriffsproblem, verursacht durch nicht erfolgtes Design. Das ist, als ob du beim Hausbau alle Steckdosen und Wasseranschlüsse im Keller angebracht hast, und jetzt Unmengen an Verlängerungskabeln und Schläuchen quer durch das ganze Haus ziehst, wo du eben gerade Strom oder Wasser brauchst. Kabel und Schläuche an sich sind nichts schlechtes, aber du behandelst damit nur die Symptome deines Problems. Die einzige andere Lösung wäre dann ja den vector als member der Klasse und dann ein Objekt erschaffen, richtig?Ganz ehrlich, die einzige richtige Lösung wäre IMHO Wegwerfen-Neumachen, aber diesmal mit einem ordentlichen objektorientierten Design. Du solltest dir diese Vorgehensweise abgewöhnen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.