Globaler Zugriff auf eine Liste



  • Hallo,
    ich verwende in meinem Programm eine Liste. Im Augenblick wird diese Liste in der Main-Funktion erzeugt. Von anderen Funktionen aus habe ich daher keinen Zugriff auf die Liste.

    Doch wie mache ich es, dass ich auch von anderen Funktionen aus auf die Liste zugreifen kann ?

    So sieht der Code im Augenblick aus:

    [l]#include "stdafx.h"
    #include "objekte.h"

    using namespace System;
    using namespace System::Collections::Generic;

    void ausgabe()
    {
    // Von hier kein Zugriff auf die List
    }

    int main(array<System::String ^> ^args)
    {
    List<objekte^> ^container = gcnew List<objekte^>();

    container->Add(gcnew objekte(111));
    container->Add(gcnew objekte(222));
    container->Add(gcnew objekte(333));
    container->Add(gcnew objekte(444));
    container->Add(gcnew objekte(555));
    container->Add(gcnew objekte(666));

    for(int i=0; i<container->Count; i++)
    {
    Console::WriteLine(container[i]->wert);
    }

    return 0;
    }[/l]

    Dies ist die Klasse objekte, die ich verwende (ist nur ein Beispiel):
    [l]#pragma once

    using namespace System;
    using namespace System::Collections::Generic;

    ref class objekte
    {
    public:
    int wert;

    objekte(int i)
    {
    wert = i;
    }

    virtual String^ ToString() override
    {
    return wert.ToString();
    }

    };[/l]

    Ich hoffe ihr könnt mir weiterhelfen.

    Vielen Dank,
    mfg arena_blau

    -----------------------



  • z.B. so kannst Du das machen:

    void ausgabe(List<objekte^>^ container) 
    { 
    // Jetzt hast Du hier Zugriff auf die Liste...
    }
    


  • Ich bekomme diese Fehlermeldung.

    3221 error displays when accessing
    

    Was kann ich tun?



  • arena_blau schrieb:

    Ich bekomme diese Fehlermeldung.

    3221 error displays when accessing
    

    Was kann ich tun?

    Wo kommt diese Fehlermeldung?



  • Hallo,
    # Ich bekomme diese Fehlermeldung.

    Das habe ich nicht geschrieben. Jemand hat die Antwort mit meinem (unregistrierten) Namen geschrieben.

    (Werd mich jetzt gleich anmelden)

    Kann man den User evtl. sperren ?
    Die IP müsste doch gespeichert sein, oder ?

    Danke,
    mfg arena_blau

    --------



  • So, jetzt bin ich registriert und keiner kann mehr unter meinem Namen posten.
    Aber zurück zum Thema:

    Wenn ich die Liste als Parameter übergebe, dann wird die Liste nicht komplett kopiert, sondern es wird nur ein Verweis auf die Liste übergeben, oder ?
    Bin ich da richtig informiert ?

    Denn die Liste kann mehrere tausend Objekte beinhalten. Wenn bei jeder Parameterübergabe die komplette Liste kopiert würde, dann würde mein Programm vermutlich sehr langsam laufen.

    Gibt es vielleicht noch eine andere Möglichkeit so etwas zu realisieren ?
    Ich stell mir das so vor wie bei globalen Variablen. Man schreibt z.B. in einer Klasse mit dem Namen "Variablen":

    static int wert;

    und kann dann von jeder Funktion aus auf die Variable zugreifen:

    Console::WriteLine(Variablen::wert);

    Geht so etwas mit einer Liste nicht ?

    Danke,
    mfg arena_blau

    ----------------------------



  • arena_blau schrieb:

    kopiert, sondern es wird nur ein Verweis auf die Liste

    Dafür sorgt das ^ nach dem Typ in der Zeile:

    void ausgabe(List<objekte^> ^ container)



  • Hallo,
    gibt es noch eine andere Möglichkeit als die Liste (oder den Verweis auf die Liste) als Parameter zu übergeben ?

    Kann ich die Liste nicht einfach global verfügbar machen ? So wie z.B. Variablen in einer Klasse, die man einfach static macht.

    Danke,
    mfg arena_blau

    ----------------------------



  • arena_blau schrieb:

    Hallo,
    gibt es noch eine andere Möglichkeit als die Liste (oder den Verweis auf die Liste) als Parameter zu übergeben ?

    Kann ich die Liste nicht einfach global verfügbar machen ? So wie z.B. Variablen in einer Klasse, die man einfach static macht.

    Danke,
    mfg arena_blau

    ----------------------------

    In C++/CLI gibt es keine globalen Variablen.
    Das Singleton Pattern würde Dir weiterhelfen.

    Jedoch bezweifle ich, dass dies in deinem Kontext wirklich angebracht ist.

    Vielmehr könntest Du die Liste abstrahieren (dabei ist die List<T> ein Member).

    Simon



  • Hallo,

    # Vielmehr könntest Du die Liste abstrahieren (dabei ist die List<T> ein
    # Member).
    Du meinst, dass ich List<T> in eine Klasse schreiben soll und dann eine Instanz der Klasse anlegen soll ? Versteh ich jetzt ehrlich gesagt nicht ganz.

    Könntest du mir dazu vielleicht einen kurzen Beispielcode schreiben ?

    Das ist nochmal das Beispiel so wie ich die Liste bisher anlege (in main()):
    List<objekte^> ^container = gcnew List<objekte^>();
    container->Add(gcnew objekte(111));

    Danke,
    mfg arena_blau

    -----------------------------



  • Benutze doch bitte Codetags!



  • Hallo,

    Vielmehr könntest Du die Liste abstrahieren (dabei ist die List<T> ein Member).

    Könntest du mir dazu einen kurzen Beispielcode posten ?

    Wenn die Liste ein Member ist, dann muss ich die Klasse ja auch wieder z.B. in main() anlegen. Dann habe ich von anderen Funktionen aus, auch keinen Zugriff darauf, oder ?

    Oder hast du das anders gemeint ?

    Danke,
    mfg arena_blau

    --------------------------------



  • arena_blau schrieb:

    Könntest du mir dazu einen kurzen Beispielcode posten ?

    Grundlagen, Gruuuuunnnnndlagen, guck doch mal ins Buch Kollege.

    Sollen wir Dir noch Dein Brei vorrühren?

    Meine nerven nochmal...

    Ein wenig Eigeninitiative wäre schon nicht schlecht...

    Aber trotzdem noch alles Gute zum Muttertag... 🙄



  • Hallo,

    # Grundlagen, Gruuuuunnnnndlagen, guck doch mal ins Buch Kollege.
    Ich hab ein ganzes Buch zu C++.NET gelesen (Jetzt lerne ich Visual C++ 2008). Die Grundlagen beherrsche ich mittlerweile eigentlich schon ganz gut.

    # Ein wenig Eigeninitiative wäre schon nicht schlecht...
    Es ist ja nicht so, dass ich mir keine Mühe gebe, nur ist C++.NET auch nicht ganz so einfach. Ich habe bisher fast nur mit VB6 programmiert. Da ist alles ein wenig einfacher.

    Ausserdem habe ich im Netz schon nach einer Lösung für mein Problem gesucht. Konnte aber leider nichts finden.

    Helft mir doch bitte auf die Sprünge.

    Danke,
    mfg arena_blau

    -----------------------------



  • Global gibt es in .Net nicht. Dafür aber statische Klassen und statische Member.

    Ansonsten schau im Grundlagenbuch unter dem Kapitel "Globale Variablen" nach. Manchmal sparen sie viel arbeit. In Normalfall erzeugen sie jedoch viel arbeit im späteren Verlauf des Projektes.

    Ansonsten: Tags sind auch für Dich da.

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-200753.html


Anmelden zum Antworten