Frage

Ich habe einen Zeiger Problem, dass ich nicht scheinen, um herauszufinden kann. Es scheint, wie ich verwendet, um Zeiger auf diese Weise ein 1000-mal habe, damit ich bin nicht ganz sicher, was hier los ist. Ich habe den folgenden Code:

int iRetVal;
CycleCountOrder* cycleOrder =  NULL;
CycleCountLineItem* cycleLine = NULL;


iRetVal = m_CycleCount.GetCCOrderLine(pOneLocation.szOrderNum[c], cycleOrder, cycleLine);

Jedes Mal, wenn ich GetCCOrderLine I Schritt innerhalb der Funktion aufrufen und ordnet gültige Werte zu den Zeigern cycleOrder und cycleLine. Wenn ich außerhalb der Funktion GetCCOrderLine Schritt wieder die Referenzen sind NULL. Der folgende Code ist, wie die GetCCOrderLine definiert:

Header-Datei

int GetCCOrderLine(CString szOrderLnitem, CycleCountOrder* cycleOrder, CycleCountLineItem* cycleCountLine);

CPP-Datei

int CCycleCount::GetCCOrderLine(CString szOrderLnitem, CycleCountOrder* cycleOrder, CycleCountLineItem* cycleCountLine)
{
    CString szCurrOrderLnitem;
    for(int c = 0; c < m_Orders.GetCount(); c++)
    {
        CycleCountOrder* currentOrder = m_Orders[c];

        for(int d = 0; d < currentOrder->m_LineItems.GetCount(); d++)
        {
            CycleCountLineItem* currentLine = currentOrder->m_LineItems[d];

            szCurrOrderLnitem.Format("%s-%d-%d", currentOrder->szOrderNum, currentLine->nLnitemNum, currentLine->nSubitemNum);

            if(szCurrOrderLnitem == szOrderLnitem)
            {
                cycleOrder = currentOrder;
                cycleCountLine = currentLine;
                return FUNC_OK;
            }
        }
    }

    return FUNC_ERROR;
}

Auch die beiden Arrays, die in dem obigen Code zugegriffen werden, und dass zuzuordnen Werte werden an den in deklarierte geben Zeiger wie folgt verwendet. Auch gefüllt sind diese Arrays mit Objekten mit dem neuen Betreiber erstellt:

CArray<CycleCountOrder*, CycleCountOrder*> m_Orders;
CArray<CycleCountLineItem*, CycleCountLineItem*> m_LineItems;
War es hilfreich?

Lösung

Ihre Funktion sollte Zeiger auf Zeiger erhalten, wenn Sie den ursprünglichen Zeiger ändern möchten.

Ansonsten nur die Kopie der Zeigerwerte und Sie diese Kopie ändern.

// will modify the copy
void ptr( MyClass * ptr_copy )
{
    ptr_copy = new MyClass();
}

// will modify the original ptr
void ptr2ptr( MyClass ** ptr_2_ptr )
{
    *ptr_2_ptr = new MyClass();
}

Andere Tipps

Führen Sie die Zeiger durch Verweis, wenn Sie die Änderungen an den Zeiger wollen in dem Anrufer reflektiert werden.

#include <iostream>
using namespace std;

void f(int *pnochange, int *&pchange){
   pnochange++;
   pchange++;
}

int main(){
   int buf[] = {1, 2};

   int *p1, *p2;
   p1 = p2 = buf;

   f(p1, p2);

   cout << *p1 << *p2;    // prints 12
}

Pass von Referenz

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top