Проблема с указателем в C ++ - PullRequest
       40

Проблема с указателем в C ++

0 голосов
/ 21 сентября 2010

У меня проблема с указателем, которую я не могу понять. Кажется, я использовал указатели таким образом 1000 раз, поэтому я не совсем уверен, что здесь происходит. У меня есть следующий код:

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


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

Всякий раз, когда я вызываю GetCCOrderLine, я захожу внутрь функции, и она присваивает действительные значения указателям cycleOrder и cycleLine. Когда я перехожу за пределы функции GetCCOrderLine, ссылки снова равны NULL. Код ниже показывает, как определяется GetCCOrderLine:

заголовочный файл

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

cpp file

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;
}

Также два массива, к которым осуществляется доступ в приведенном выше коде и которые используются для присвоения значений передаваемым указателям, объявляются следующим образом. Также эти массивы заполнены объектами, созданными с помощью нового оператора:

CArray<CycleCountOrder*, CycleCountOrder*> m_Orders;
CArray<CycleCountLineItem*, CycleCountLineItem*> m_LineItems;

Ответы [ 3 ]

5 голосов
/ 21 сентября 2010

Ваша функция должна получить указатель на указатель, если вы хотите изменить исходный указатель.

В противном случае вы просто получаете копию значений указателя и изменяете эту копию.

// 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();
}
4 голосов
/ 21 сентября 2010

Передайте указатели по ссылке, если вы хотите, чтобы изменения указателей были отражены в вызывающем абоненте.

#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
}
3 голосов
/ 21 сентября 2010

Передача по ссылке

...