c++ - 为什么带有指针参数的成员函数需要指向指针的指针?
问题描述
我有一个通用类:
template<typename T>
class QuadTree {
该类的节点具有成员变量,如下所示
QuadTree<T*>* nw;
我遇到的问题是以下成员函数:
bool insert(T *obj) {
//...
if (nw->insert(obj)) return true;
//...
我认为这会起作用,但除非我传递 &obj,一个指向指针的指针,否则我会得到一个错误。当我设置T
在Circle
Visual Studio 中时,Intellisense 将方法签名显示为bool QuadTree<Circle *>::insert(Circle **obj)
,但为什么会这样呢?
编辑:这是该类的剥离版本:
template<typename T>
class QuadTree {
const int QT_NODE_CAPACITY = 4;
std::vector<T*> elements;
QuadTree<T*>* nw;
QuadTree<T*>* ne;
QuadTree<T*>* sw;
QuadTree<T*>* se;
public:
QuadTree<T>() : nw(nullptr), ne(nullptr), sw(nullptr), se(nullptr) {
elements = std::vector<T*>();
}
bool insert(T* obj) {
//if (!boundary.containsObject(obj)) {
// return false; //Object does not belong here
//}
if (elements.size() < QT_NODE_CAPACITY && nw == nullptr) {
elements.push_back(obj);
return true;
}
if (nw == nullptr) {
//subdivide();
}
//Try to insert element in one of the subtrees until it succeeds
if (nw->insert(&obj)) return true;
if (ne->insert(&obj)) return true;
if (sw->insert(&obj)) return true;
if (se->insert(&obj)) return true;
return false; //should never be reached
}
};
解决方案
在您的课程模板中...
template<typename T>
class QuadTree {}
...如果 T 是实例化期间的指针(它是)...
QuadTree<T*>* nw; //NOTE <T*>, not <T>
...这意味着bool insert(T* obj)
,当实例化时,变为 bool insert((T*)* obj)
(因为 T 已经是类型指针 -用于强调的括号)。因此,在插入时不需要获取对象的地址(在许多其他错误中)。当您确实获取对象的地址时,您实际上是在获取临时地址(指针变量)-这是您的错误。
一个解决方案可能是将 insert 更改为insert(T& obj)
,这将允许您获取引用的地址,或者更改为insert(T*& obj)
,这意味着您已经存储了真实指针的地址(而不是通过值传递的参数的地址...一个具有地址值的变量,其生命周期仅适用于函数)...希望它有意义)。
推荐阅读
- python - 如何遍历未知大小的张量并对其元素进行张量运算?
- android - 在 Android WebView 中监听窗口事件
- java - 向 GUI 构造函数添加参数会停止 GUI 弹出
- c++ - C++ 编程,动态内存使用 malloc 和 calloc 无法正常工作
- c# - C# Task.Run 在进行多次迭代时跳过值,缺少数据
- c# - 从列表中删除重复项,忽略空格
- arrays - Kotlin - 在 hashmap 中存储和读取数组
- c - 结构指针数组的问题
- node.js - 我应该何时打开和关闭 websocket 连接以在另一个应用程序内进行聊天?
- javascript - ESLint 没有出现在 VScode 中