я могу получить, где проблема в этом фрагменте:
Я хочу сбросить указатель внутри функции, я добился, чтобы она работала, просто возвращая указатель, но я не мог сделать это с побочным эффектом (передавая указатель).
void function(Object * obj)[{
obj = new Object();
cout << obj << endl;
//return obj;
}
main(){
Object * obj = 0;
function(obj);
cout << obj << endl;
}
В этом случае результат:
0x12345678
0
в то время как это должно было быть
0x12345678
0x12345678
Я пытался использовать указатель указателя или указатель ссылок, но все еще не смог пройти через функцию. Хотя просто возвращение значения работало как шарм. Но мне нужно сделать это по нескольким параметрам, и код гораздо сложнее, чем здесь показывается.
Если вы измените объявление своей функции так, оно должно работать:
void function(Object * &obj)
В исходном коде вы передавали указатель по значению, что означает, что функция сделала копию указателя, и любые изменения указателя в функции не будут отражены. Когда вы передаете по ссылке, вы на самом деле работаете с исходными данными, это может быть сделано за кулисами с помощью указателей.
Вы можете захотеть увидеть Эта тема.
Возврат объекта по указателю на указатель (путь C):
void function(Object ** obj) {
*obj = new Object();
}main(){
Object * obj = 0;
function(&obj);
...
Возврат объекта по ссылке на указатель (путь C ++):
void function(Object *& obj) {
obj = new Object();
}
main(){
Object * obj = 0;
function(obj);
...
когда ты звонишь
void function(Object * obj){
вы копируете указатель obj, другими словами, стек «функции» теперь содержит локальную копию указателя с именем obj. Когда функция возвращает эту локальную копию, она уничтожается.
Йо может достичь того, что вы хотите, с помощью:
void function(Object* obj&){
Который фактически передаст указатель obj вызывающей стороны, по ссылке. Теперь любое изменение в obj также будет отражено в области действия вызывающей стороны.