Итак, я хочу передать указатель на функцию и изменить эту функцию внутри этой функции. Как это сделать вообще? Здесь?Как изменить указатель через параметр
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;
}
}
«Я хочу избежать передачи по значению». Почти каждый параметр (кроме 'success') передается по значению. «Если я использую указатель на указатель, я боюсь, что он не изменит значение' tempVendorPtr' в 'removeNode'. Почему вы боитесь, он * будет * изменять указатель. Вы можете уточнить? – Rakete1111
Извините, но в чем проблема? Или что и где вы пытаетесь достичь «_pass указатель на функцию и чтобы эта функция меняла этот указатель» –
Получите его по ссылке. Довольно тривиально. – EJP