Memberfunktion deklarieren mit Rückgabewert CStringArray

mistirios

Mitglied
Hallo,

ich habe folgendes Problem. Ich füge in meiner Dokumentenklasse eine Memberfunktion die ein Rückgabewert von einem Array hat. Die Funktion ist public definíert.Und das CString Array ist private.

Code:
CStringArray CAdrDoc::getKeys(void) 
{ 
    m_posMapPos =  m_pAdressenMap.GetStartPosition(); 
    
    while( m_posMapPos!= NULL ) 
    { 
      CAdresse* pAdr; 
      CString string; 
      m_pAdressenMap.GetNextAssoc( m_posMapPos, string, pAdr ); 
      m_strArray.Add(string); 
     } 
      
    return m_strArray; 
    
}

Ich bekomme folgende Fehlermeldung:
Code:
1>c:\programme\microsoft visual studio 8\vc\atlmfc\include\afxcoll.h(593) : error C2248: "CObject::CObject": Kein Zugriff auf private Member, dessen Deklaration in der CObject-Klasse erfolgte. 
1>        c:\programme\microsoft visual studio 8\vc\atlmfc\include\afx.h(558): Siehe Deklaration von 'CObject::CObject' 
1>        c:\programme\microsoft visual studio 8\vc\atlmfc\include\afx.h(529): Siehe Deklaration von 'CObject' 
1>        Diese Diagnose trat in der vom Compiler generierten Funktion "CStringArray::CStringArray(const CStringArray &)" auf.

Wieso bekomme ich hier diese Fehlermeldung? Die Funktion ist doch publicund greift auf das private CStringArray zu?
Ich möchte grundsätzlich auf das CStringArray über die Methode mittels der View Klasse mit GetDocument() zugreifen

mfg
 
Hallo,

die Klasse CObject besitzt vermutlich einen nicht-öffentlichen Kopierkonstruktor. Da CStringArray von CObject erbt, gilt für diese Klasse selbiges. Dieser Kopierkonstruktor muss aber aufgerufen werden, wenn man ein Objekt „by value“ zurückgibt. Eine mögliche Lösung wäre hier, das Objekt über eine Referenz zurückzugeben (CStringArray& anstatt CStringArray).

Grüße,
Matthias
 
Hi,

erstmal danke für deine Hilfe mit dem kompilieren hat das jetzt geklappt. Allerdings ergibt sich das nächste Problem :-(. Die Funktion getKeys() rufe ich in der OnUpdate() auf.

Code:
void CAdrView::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/)
{
	
	//m_ListBox.ResetContent();
	CStringArray& mstr=GetDocument()->getKeys();
	TRACE("%s",mstr[0]);
	//m_ListBox.AddString(mstr[0]);

}

Jedoch wenn ich das Programm ausführen will kommt eine Fehlermehldung Debug Assertion Failed. Was mache ich falsch? Mit dem Index vom CStringArray kann ich doch normalerweise auf die jeweiligen im Array gespeicherten CStrings zugreifen oder? Also das was ich ursprünglich machen wollte war, dass ich immer bei OnUpdate den Inhalt vom Array in die ListBox speichere.

mfg mistirios
 
Hi,

bei einem CStringArray-Objekt musst du mit der Funktion ->GetAt() auf die Elemente zugreifen!

Mit deiner Anweiseung

mstr[0]

würdest du auf das erste CStringArray-Objekt in einem CStringArray-Array zugreifen und das hast du net ;-)

Das CStringArray-Objekt ist kein eigentliches Array. Es ist so was wie eine Wrapperklasse für ein dynamisches Stringarray.

Wenn du eine Klasse verwendest, schau dir immer die verfügbaren Memberfunktionen an, die diese Klasse bietet.
Ich hoffe für dich dass du eine aktuelle MSDN installiert hast, sonst nutz die im internet bei:

http://msdn2.microsoft.com/de-de/default.aspx

Gruß,

Peter
 
Zuletzt bearbeitet:
Hi,

also ich würde dann doch mit GetAt(0), den ersten CString im meinen gespeicherten CStringArray bekommen oder? Ich habs jetzt mal so probiert TRACE("%s",mstr.GetAt(0));
Kommt das gleiche dabei raus. Debug assertion failed.

Kann das sein dass es daran liegt, dass der Container in getKeys sich erst bei drücken des Buttons meiner GUI füllt und gleichzeitig auch Einträge in die ListBox macht? Am Anfang sind aber alle beide leer. OnUpdate wird doch auch beim Start von Initialupdate aufgerufen oder? Ds würde bedeuten, dass ich mit mstr.GetAt(0) auf nichts zugreife und das Programm den crash auslöst.

mfg
mistirios
 
Schreibe deinen Code zum Ausgeben der Werte doch so:

Code:
    CStringArray x = // woher auch immer
    if( x.Getlength() > 0 ) {
        TRACE("%s",x.GetAt(0));
    }

Es ist immer besser beim Coden darauf zu achten (es zu überprüfen), dass es den Wert auch gibt, mit dem man arbeiten möchte ;)

Ausserdem denke ich dass dein Code in OnUpdate völlig misplaziert ist. Vor allem dann, wenn du den Grund des Updates (lHint) nicht auswertest.

Gruß,

Peter
 
Hi,

erstmal danke für deine Hilfe. Nee die OnUpdateData() das ist schon Okay so wie sie ist. ;-) Das ausschlaggebende war meine Vermutung mit dem auf leeren Inhalt zugreifen.

Wie du schon sagtest:
Es ist immer besser beim Coden darauf zu achten (es zu überprüfen), dass es den Wert auch gibt, mit dem man arbeiten möchte

;)

Nichts destotrotz jetzt gehts :)

mfg
mistirios
 

Neue Beiträge

Zurück