Verständisproblem?



  • Folgendes:

    // A : funktioniert

    CConfiguration::CModul *pFrom =m_pConfig->getModul(iFromMod);
    double x= pFrom->m_PhyMod.m_dHandlerPosition;
    

    // B: Funktioniert nicht

    double x= (m_pConfig->getModul(iFromMod))->m_PhyMod.m_dHandlerPosition;
    

    warum? ist doch das selbe????

    Komischerweise kommt der Fehler:

    c:\test\AllocStruct\Transfer.h(132): error C2662: 'CConfiguration::getModul' : cannot convert 'this' pointer from 'const CConfiguration' to 'CConfiguration &'
    

    in der zeile:

    CConfiguration::CModul *pFrom =m_pConfig->getModul(iFromMod);
    

    Code der Funktion:

    CConfiguration::CModul* CConfiguration::getModul(int iModul){
    
    	for(int i=0; i< m_aModul.GetSize(); i++){
    		if(m_aModul.ElementAt(i).m_iModulNr==iModul)
    			return &(m_aModul.ElementAt(i));
    	}
    	return 0;
    }
    


  • Es wäre nett, wenn du auch dazusagen könntest, was der Compiler an Version B auszusetzen hat 😉

    (edit: hat sich erledigt)

    -----

    Was denn nun? Welche Variante liefert denn nun den Fehler? Und bist du sicher, daß du nicht irgendwo unterwegs ein 'const' unterschlagen hast?



  • das problem meldet er:

    c:\test\AllocStruct\Transfer.h(137): error C2227: left of '->m_PhyMod' must point to class/struct/union
    

    aber ist auch nur das sekundäre problem.. der error C2662 ist primär, solange der da ist, geht keiner der beiden Optionen..



  • hola

    in zeile

    CConfiguration::CModul *pFrom =m_pConfig->getModul(iFromMod);
    

    ist da m_pConfig vielleicht 'const' ?

    Meep Meep



  • Wie ist denn m_pConfig? definiert? (wenn das ein const-Zeiger ist, kannst du keine nicht-const Methoden darauf loslassen)



  • hey danke jungs..
    ja "m_pConfig" war const..jettz gehts .

    ABER ich frage mich trozdem, wieso er meckert, da ich ja nur daten aus m_pConfig lese , und nichts schreibe...



  • du liest zwar nur daraus, gibst aber einen nicht-const zeiger zurueck. der koennte dann aber versuchen an den daten rumzuschrauben.

    Meep Meep



  • hmm ok verstehe, würde ich aber nur die Funktion getModul() const machen?
    gibts wieder ein problem mit dem MFC CArray und ElementAt.. ich nehme an , weil die methode keine const zurück gibtt oder?



  • OT: frage an die leute die sich da auskennen:

    kann const-correctness was mit dem cpu-cache zu tun haben?

    wenn der comiler weis, das nur gelesen werden kann, braucht er die daten in dem cache nicht in den speicher zurueckschreiben. wenn die memberfunktion jedoch nicht const ist, muss er eigendlich dafuer sorgen das die cache-line wieder in den speicher zurueckgeschrieben wird, bevor sie mit anderen daten ueberschrieben wird. kann das so zutreffen? is mir grad so durch den kopf gegangen.

    Meep Meep



  • dann schreibst die methoden einfach doppelt. einmal mit und einmal ohne 'const'.
    die const-deklarierte memberfunktion muss dann aber auch einen const-pointer zurueckgeben

    Meep Meep



  • Meep Meep schrieb:

    OT: frage an die leute die sich da auskennen:

    kann const-correctness was mit dem cpu-cache zu tun haben?

    wenn der comiler weis, das nur gelesen werden kann, braucht er die daten in dem cache nicht in den speicher zurueckschreiben. wenn die memberfunktion jedoch nicht const ist, muss er eigendlich dafuer sorgen das die cache-line wieder in den speicher zurueckgeschrieben wird, bevor sie mit anderen daten ueberschrieben wird. kann das so zutreffen? is mir grad so durch den kopf gegangen.

    Wenn sich das const nur auf eine Referenz/Pointer bezieht reicht es im Allgemeinen nicht für eine solche Optimierung, da es immer zusätzlich noch eine nicht-konstante Referenz geben könnte (Stichwort: Aliasing. Das const sagt nur, dass das dahinterliegende Objekt nicht über diese Referenz geändert wird. Eine andere non-const-Referenz hingegen kann das Objekt durchaus ändern) . Der Compiler müsste also schon eine komplette Analyse durchführen und deren Ergebnis ist dann letztlich unabhängig von der const-Deklaration.

    Siehe auch:
    http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.10
    http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.14
    http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.15


Anmelden zum Antworten