Zugriff Problem auf Vector-Inhalt



  • Hi,
    ich habe ein Problem bezüglich des Zugriffs auf den Inhalt eines Vectors, der wiederum aus einem Struct besteht.

    Hintergrund des ganzen ist, dass ich eine Funktion geschrieben habe, die ich jetzt als Thread laufen lassen will. Ich muss die Funktion dadurch allerdings ziemlich verändern, da ich dadurch keinen Zugriff mehr auf die Member-Variablen der eigenen Klasse mehr habe.

    Ich benutze AfxBeginThread(RequestFile, (LPVOID)&m_RequestStruct), wobei RequestFile die auszuführende Funktion ist und &m_RequestStruct der Parameter den ich Übergebe. m_RequestStruct ist folgendermaßen aufgebaut:

    struct RequestStruct
    {
    	vector<ExampleStruct>	 *pm_Vector1;
    	vector<ExampleStruct>     *pm_Vector2;
    	vector<ExampleStruct>	 *pm_Vector3;
    	UserStruct		 *pm_UserValues;
    	CListCtrl		  *pm_FileList;
    };
    
    .
    .
    .
    
    // Die Pointer des RequestStruct zeigen auf entsprechende
    // Member-Variablen vom Typ vector<ExampleStruct>
    
    m_RequestStruct.pm_Vector1 = &m_Vector1;
    m_RequestStruct.pm_Vector2 = &m_Vector2;
    

    Soweit so gut, ich übergebe also einen Pointer auf diese Structur, welche wiederum mehrere Pointer auf mehrere Vectoren, gefüllt mit anderen Structs beinhaltet.
    Das ExampleStruct kann man sich folgendermaßen vorstellen:

    struct ExampleStruct
    {
    	int     FileSize;
    	CString FileName;
    	CString FileDirectory;
    };
    

    In meiner RequestFile Thread Funktion greife ich wiefolgt auf den Pointer zu

    UINT MyClassDlg::RequestFile(LPVOID pParam)
    {
    	RequestStruct *pRS = (RequestStruct*) &pParam;
    }
    

    Wenn ich jetzt "pRS->pm_Vector2[0]." eintippe, zeigt mir IntelliSense nur die
    Funktionen des Vectors an, also push_back, clear, begin usw.
    Ich möchte jedoch Zugriff auf den Inhalt des Vectors, sprich die Variablen FileName, FileDirectory, FileSize. Ich hab mit Pointern leider nicht soviel Erfahrung. Ich hoffe mein Problem ist einigermaßen verständlich und jemand kann mir weiterhelfen. Vielen Dank schonmal.



  • Doch also ein std::vector hat den operator [] überladen ... um Bereichsüberläufe zu verhindern, kannst du auch die at(...) Funktion des std::vector nutzen.

    Dein Code hat allerdings viele unschöne Stelen. Du solltest über dein Klassendesign nachdenken.

    Achja, guck dir mal an, was man unter C++-Style-Cast und was man nuter C-Style-Cast versteht(was du nutzt).

    Dann solltest du evtl. noch wissen das struct's sich nicht soo sehr von Klassen unterscheiden, nur das sie default public sind nud nicht private, wie Klassen.
    => struct's haben auch einen {c-tor} und einen {d-tor}. Den kann man nutzen! 😛



  • (D)Evil schrieb:

    Dein Code hat allerdings viele unschöne Stelen. Du solltest über dein Klassendesign nachdenken.

    Könntest du vielleicht sagen welche Stellen genau "unschön" sind und evtl. Verbesserungsvorschläge machen?

    (D)Evil schrieb:

    Achja, guck dir mal an, was man unter C++-Style-Cast und was man nuter C-Style-Cast versteht(was du nutzt).

    Ich hab versucht genauere Auskunft darüber zu finden aber hab auf die Schnelle nichts konkretes gefunden. Kannst du mir vielleicht den wesentlichen Unterschied sagen, am besten mit Beispielcode.

    (D)Evil schrieb:

    => struct's haben auch einen {c-tor} und einen {d-tor}. Den kann man nutzen! 😛

    Beispiel?



  • @Beispiel:

    typedef vector<ExampleStruct> Examples;
    
    struct RequestStruct {
       RequestStruct(Examples& v1, Examples& v2, Examples& v3) :
          m_Vector1(v1),
          m_Vector2(v2),
          m_Vector3(v3) {}
       vector<ExampleStruct>&   m_Vector1, m_Vector2, m_Vector3;
    // ...
    };
    
    .
    .
    .
    
    // Die Pointer des RequestStruct zeigen auf entsprechende
    // Member-Variablen vom Typ vector<ExampleStruct>
    
    RequestStruct m_RequestStruct(m_Vector1, m_Vector2, m_Vector2);
    

    Die Dinger als Pointer zu verwalten, ist wahrscheinlich nicht nötig (ein RequestStruct scheint ja nur eine temporäre Bündelung extern verwalteter Daten zu sein) und mit Referenzen spart man nicht nur Tipparbeit, sondern hat auch prima ausgedrückt, dass RequestStruct die Teile nicht selbst verwalten soll.

    Gruß,

    Simon2.



  • Hi Simon2, danke für deine Antwort, jetzt weiß ich was damit gemeint war. Werd es so gleich mal ausprobieren. Und ja du hast recht, das RequestStruct ist nur ne Temporäre Bündelung zur Übergabe an einen Thread.


Anmelden zum Antworten