Zugriff auf globale list eines anderen Dialoges



  • Hallo @all,

    ich habe das folgende Konstrukt:

    Ich greife in einem übergeordneten Dialog auf eine untergeordnete Klasse zu:

    CChildDialog m_ChildDlg;
    

    ... // Create etc.

    Auf die global definierten Variablen etc. der Unterklasse kann ich zugreifen mit:

    m_ChildDlg.Variable
    

    Nun aber mein Problem, wie kann ich auf eine List im ChildDialog von außen zugreifen:

    Normal im ChildDialog, funktioniert:

    for ( list<StructName>::iterator i = m_List.begin(); i != m_List.end(); i++ )
    

    Von außen, funktioniert so NICHT:

    for ( list<m_ChildDlg.StructName>::iterator i = m_ChildDlg.m_List.begin(); i != m_ChildDlg.m_List.end(); i++ )
    

    😕



  • Zeig mal etwas mehr (und vor allem zusammenhängenden) Code. (nein, damit meinte ich nicht, daß du das komplette Projekt hier reinkopieren sollst)

    Und es wäre auch hilfreich, wenn du dazusagst, was der Compiler an dem Aufruf zu bemängeln hat.



  • Hi, hier die gewünschten Infos:

    // CChildDialog dialog
    class CChildDialog : public CDialog
    {
    public:
    // standard constructor etc.
    
    struct StructName {
      CString Name_eins;
      CString Name_zwo;
    };
    
        // Liste
        list<StructName> m_List;
    
    protected:
    	virtual BOOL OnInitDialog();	// etc.	
    };
    
    // Main-Dialog:
    
    // CMainDialog dialog
    class CMainDialog : public CDialog
    {
    public:
      // standard constructor etc.
    
    protected:
    	virtual BOOL OnInitDialog();					
       CChildDialog m_ChildDlg;				
    };
    
    // Nun im Hauptdialog in einer Funktion:
    
    for ( list<m_ChildDlg.StructName>::iterator i = m_ChildDlg.m_List.begin(); i != m_ChildDlg.m_List.end(); )
      AfxMessageBox("Test");
    

    Fehlermeldung:

    .\ObjekteDialog.cpp(1299) : error C2274: 'function-style cast' : illegal as right side of '.' operator
    .\ObjekteDialog.cpp(1299) : error C2955: 'std::list' : use of class template requires template argument list
    C:\Programme\Microsoft Visual Studio 8\VC\include\list(1238) : see declaration of 'std::list'
    .\ObjekteDialog.cpp(1299) : error C2514: 'std::list<_Ty,_Ax>::_Iterator<true>' : class has no constructors
    .\ObjekteDialog.cpp(1299) : error C2678: binary '!=' : no operator found which takes a left-hand operand of type 'std::list<_Ty,_Ax>::_Iterator<true>' (or there is no acceptable conversion)
    C:\Programme\Microsoft Visual Studio 8\VC\include\list(293): or 'bool std::list<_Ty,_Ax>::_Const_iterator<_Secure_validation>::operator !=(const std::list<_Ty,_Ax>::_Const_iterator<_Secure_validation> &) const'
    while trying to match the argument list '(std::list<_Ty,_Ax>::_Iterator<true>, std::list<_Ty>::_Iterator<_Secure_validation>)'
    with
    [
    _Ty=CObjektInfoDialog::StructName,
    _Secure_validation=true
    ]
    .\ObjekteDialog.cpp(1299) : error C2678: binary '++' : no operator found which takes a left-hand operand of type 'std::list<_Ty,_Ax>::_Iterator<true>' (or there is no acceptable conversion)
    C:\Programme\Microsoft Visual Studio 8\VC\include\list(402): could be 'std::list<_Ty,_Ax>::_Iterator<_Secure_validation> std::list<_Ty,_Ax>::_Iterator<_Secure_validation>::operator ++(int)'
    C:\Programme\Microsoft Visual Studio 8\VC\include\list(396): or 'std::list<_Ty,_Ax>::_Iterator<_Secure_validation> &std::list<_Ty,_Ax>::_Iterator<_Secure_validation>::operator ++(void)'
    while trying to match the argument list '(std::list<_Ty,_Ax>::_Iterator<true>, int)'



  • An die Namen der eingebetteten Klassen kommst du auch nicht über ., sondern über den Scope-Operator ::

    for(list<CChildDialog::StructName>::iterator i = m_ChildDlg.m_list.begin();...)
    

    PS: public Member sind böse 😉



  • Ok besten Dank, jetzt kann ich auf die bösen "public member" von außen zugreifen 😉



  • Dressman1981 schrieb:

    jetzt kann ich auf die bösen "public member" von außen zugreifen 😉

    Ja, und niemand kann überwachen, was mit ihnen passieren wird (das ist der Grund, warum man sie vermeiden sollte - du hast keine Kontrolle darüber, wer was mit deinen Daten anstellt). Die bessere Lösung ist es, die Membervariablen private zu setzen und nur über genau definierte Getter/Setter Zugriff zu erlauben.


Anmelden zum Antworten