2017-02-28 1 views
2

Dies ist C++ Win32-Programm. Ich habe eine Methode gemacht, aber das ist nicht kompiliert.Warum kann ich kompilieren, wenn ich CStringArray als Argument der Methode verwende

Ich erwarte, dass die Ursache des Problems CStringArray als Argument der Methode verwendet.

Ipc3dxContainerPtr KmCdmMakeMultiProjectAction::FindLastFolder 
(Ipc3dxContainerListPtr folderList, CStringArray folderNameArr) 
{ 
    Ipc3dxContainerPtr folder = NULL; 
    // skip other process 
    return folder; 
} 

Und dies von diesem aufgerufen.

Ipc3dxContainerPtr folder = FindLastFolder(folderList, s_ForlderName); 

Kann ich etwas beraten? Danke.

+1

10 Und der Kompilierungsfehler ist? –

+0

Richard Critten // Entschuldigung! Fehler ist das "Fehler C2248: 'CObject :: CObject'": Kann nicht auf privates Mitglied zugreifen – user5949771

Antwort

1

In

Ipc3dxContainerPtr KmCdmMakeMultiProjectAction::FindLastFolder 
(Ipc3dxContainerListPtr folderList, CStringArray folderNameArr) 

CStringArray folderNameArr wird als Wert übergeben. Dadurch wird der Kopierkonstruktor CStringArray ausgelöst, der versuchen wird, seine Basisklasse zu kopieren. CObject und CObject können nicht kopiert werden, da der Kopierkonstruktor private ist, um das Kopieren zu verhindern. In C++ 11 und neuer wäre der Kopierkonstruktor delete d, was Ihnen wahrscheinlich eine viel leichter zu verstehende Fehlermeldung gibt.

Lösung: Pass durch Referenz: CStringArray & folderNameArr Wenn Sie nicht möchten folderNameArr innerhalb der Funktion geändert werden, verwenden Sie const CStringArray & folderNameArr. Wenn Sie eine Kopie des Parameters, aber nicht das Original ändern möchten, machen Sie einen neuen CStringArray und CStringArray::AppendfolderNameArr dazu.

+0

Vielen Dank für Ihre Erklärung! – user5949771

0

Nun erklären Sie folderList als object und versuchen, es hier zu verwenden,

Ipc3dxContainerPtr folder = NULL; <-- Error Here 

und nicht als pointer to object. Wenn Ihre class nicht eingerichtet ist, um diesen Umstand zu behandeln, wird die compilationerror wahrscheinlich von der Handhabung innerhalb der class kommen.

würde gelten die gleichen, warum

Ipc3dxContainerPtr folder = FindLastFolder(folderList, s_ForlderName); 

nicht funktioniert. Also, ändern Sie einfach folderList zu *folderList.

+0

Nick Pavini. Vielen Dank für Ihren Kommentar und Entschuldigung nicht genug, um mein Problem zu erklären. Die Ursache des Fehlers war CStringArray. Und ich habe das gelöst.Meine ursprüngliche Quelle ist geschrieben, was Objekt in "Ipc3dxContainerPtr Ordner" und die anderen Prozesse einfügen. Aber ich habe meine Frage nicht geschrieben. Vielen Dank! – user5949771

+0

@ user5949771 lol ist cool –

0

Zuerst Entschuldigung, dass Erklären nicht genug war. Und löste dies.

void KmCdmMakeMultiProjectAction::MethodA() 
{ 
    CStringArray s_ForlderName; 
    s_ForlderName.Add("Hi"); 

    Ipc3dxContainerListPtr folderList = cabinet->GetContainerList(); 

    Ipc3dxContainerPtr folder = FindLastFolder(folderList, s_ForlderName); 
} 

Ipc3dxContainerPtr KmCdmMakeMultiProjectAction::FindLastFolder 
(Ipc3dxContainerListPtr folderList, CStringArray folderNameArr) 
{ 
    Ipc3dxContainerPtr folder = NULL; 
    // skip other process 
    folder = (Ipc3dxContainerPtr)folderList->GetItem(0) 
    return folder; 
} 

Diese Quelle fehlgeschlagen. Und ich kann mit dem Bearbeiten so lösen.

Ipc3dxContainerPtr KmCdmMakeMultiProjectAction::FindLastFolder 
(Ipc3dxContainerListPtr folderList, CStringArray& folderNameArr) 
{ 
    \\CStringArray folderNameArr -> CStringArray& folderNameArr 
} 

Ich weiß immer noch nicht, warum dieses Problem passiert. Weil ich die grundlegende Theorie von C++ nicht verstehe. Wie auch immer ich dieses Problem gelöst habe.

Notwendigkeit von Menschen referenziert haben dasselbe Problem, danke.

Verwandte Themen