2016-08-12 3 views
0

Итак, я хочу передать указатель на функцию и изменить эту функцию внутри этой функции. Как это сделать вообще? Здесь?Как изменить указатель через параметр

EDIT:

Поскольку TreeNode является структурой указателей, которые я хочу взять nodePtr->vendorDataRef внутри функции removeLeftMostNode(...) и каким-то образом получить его обратно в вызывающую функцию. Я думал, что я мог бы сделать это с помощью параметра removeLeftMostNode(...) следовательно removeLeftMostNode(...aVendor* vendorDataRef)

т.е.

aBst::treeNode * aBst::removeNode(aBst::treeNode * nodePtr) 
{ 
    aVendor * tempVendorPtr; //<----...to be assigned to this 
    treeNode * nodeToConnectPtr, * tempPtr; 
    ... 
    tempPtr = removeLeftMostNode(nodePtr->right, &tempVendorPtr); 
    ... 
} 

aBst::treeNode * aBst::removeLeftMostNode(aBst::treeNode * nodePtr, aVendor* vendorDataRef) 
{ 
    if(nodePtr->left == NULL) 
    { 
     //Target acquired, modify the value of vendorData through parameter 
     vendorDataRef = nodePtr->vendorData; //<---I want this pointer... 
     return removeNode(nodePtr); 
    } 
    else 
     return removeLeftMostNode(nodePtr->left, vendorData); 
    } 

Это TreeNode структура

struct treeNode 
{ 
    aVendor * vendorData; 
    treeNode * left; 
    treeNode * right; 
}; 

Как вы могли догадаться, это часть кода в удалите запись из двоичного дерева поиска. Это код, который называет это косвенно.

bool aBst::remove(char nameOfVendor[]) 
{ 
    bool failControl = false; 

    removeValue(root, nameOfVendor, failControl); 

    return failControl; 
} 

aBst::treeNode * aBst::removeValue(aBst::treeNode * subTreePtr, char nameOfVendor[], bool& success) 
{ 
    //Note: the subTreePtr should be root in initial call 
    treeNode * tmpPtr; 
    char name[MAX_CHAR_LENGTH]; 

    subTreePtr->vendorData->getName(name); 

    if(subTreePtr == NULL) //Empty Tree 
    { 
     success = false; 
     return NULL; 
    } 
    else if(strcmp(name, nameOfVendor) == 0) //Evaluates to true if there is a match 
     { 
      //Item is in root of subTreePtr 
      subTreePtr = removeNode(subTreePtr); 
      success = true; 
      return subTreePtr; 
     } 
     else if(strcmp(name, nameOfVendor) < 0) // Go left 
      { 
       tmpPtr = removeValue(subTreePtr->left, nameOfVendor, success); 
       subTreePtr->left = tmpPtr; 
       return subTreePtr; 
      } 
      else // Go Right 
      { 
       tmpPtr = removeValue(subTreePtr->right, nameOfVendor, success); 
       subTreePtr->right = tmpPtr; 
       return subTreePtr; 
      } 
} 
+1

«Я хочу избежать передачи по значению». Почти каждый параметр (кроме 'success') передается по значению. «Если я использую указатель на указатель, я боюсь, что он не изменит значение' tempVendorPtr' в 'removeNode'. Почему вы боитесь, он * будет * изменять указатель. Вы можете уточнить? – Rakete1111

+0

Извините, но в чем проблема? Или что и где вы пытаетесь достичь «_pass указатель на функцию и чтобы эта функция меняла этот указатель» –

+0

Получите его по ссылке. Довольно тривиально. – EJP

ответ

3

Как я могу это сделать вообще?

Чтобы изменить любой объект, будь то объект или указатель на объект, вы можете передать ссылку на него.

void foo(int& i) 
{ 
    // Assign to i. The change will be visible in the calling function. 
    i = 10; 
} 

void bar(int*& ptr) 
{ 
    // Assign to ptr dynamically allocated memory. 
    // The memory will be valid in the calling function. 
    ptr = new int[20]; 
} 

int main() 
{ 
    int i; 
    int* ptr; 

    foo(i); // When the function returns, i will be 10 
    bar(ptr); // When the function returns ptr will point to an array of 10 ints 
    ptr[5] = 20; // OK since memory for ptr was allocated in bar. 

    ... 

    // Deallocate memory to prevent memory leak. 
    delete [] ptr; 
} 
+0

Отлично, этот второй пример был именно тем, что я искал. Я пробовал что-то подобное, но моя ошибка вызывала бар, как bar (& ptr) –

Смежные вопросы