C++中能否在void函数内实例化对象并修改外部指针?
如何在C++中用void函数修改指针指向?
嘿,我太懂你踩的这个C++坑了!你写的这段代码里,instantiate函数拿到的只是指针t的副本——说白了就是函数自己搞了个临时指针,和主函数里的t根本不是同一个东西,所以函数里给副本分配内存,主函数里的原指针当然还是NULL。不过别担心,有两种完美满足你要求的办法,而且都能用void函数实现:
方法1:传递指针的指针(双重指针)
既然要修改指针本身,那我们就得把指针的地址传进去,让函数能直接操作原指针的存储位置:
void instantiate(myType** t) { *t = new myType(); // 解引用到原指针的地址,修改它的指向 } int main() { myType* t = NULL; // ... instantiate(&t); // 传递指针的地址 // ... if (t != NULL) { // do something } delete t; // 别忘了释放内存,避免泄漏! }
这样函数里的*t就是主函数中t的真身,分配内存后原指针自然就指向新创建的对象了。
方法2:传递指针的引用
C++的引用特性比双重指针更直观,它相当于变量的“别名”,函数里对引用的操作就是直接操作原变量:
void instantiate(myType*& t) { // 这里声明的是指针的引用 t = new myType(); } int main() { myType* t = NULL; // ... instantiate(t); // 直接传指针就行,因为是引用 // ... if (t != NULL) { // do something } delete t; // 同样要记得释放内存! }
这种写法代码更简洁,可读性也更高,是C++里更推荐的方式。
内容的提问来源于stack exchange,提问作者Daniel Franklin
相关产品推荐
相关产品推荐

