【发布时间】:2021-12-16 07:09:39
【问题描述】:
我定义了一个类来包装原始指针,因此可以自动删除指针。这是我的代码
#include <iostream>
class Entity
{
private:
std::string e_name;
public:
Entity():e_name("unknown"){}
void whoami() {
std::cout << e_name;
}
};
class ScopePointer
{
private:
Entity *_e;
public:
ScopePointer(Entity *e) : _e(e) {}
~ScopePointer() { delete _e; }
Entity *operator->() { return _e; }
};
int main(int argc, char *argv[])
{
ScopePointer p(new Entity());
p->whoami();
}
它运作良好,但我完全不明白p->whoami(); 是如何运作的。
我的意思是 ScopePointer 中的 operator -> 重载应该像下面这样工作
p.operator->()->whoami();or p->->whoami();
第一个 -> 应该返回 Entity* 和下一个 -> 调用类方法。
为什么只有一个 -> 可以让它工作?
【问题讨论】:
-
“为什么只有一个 -> 可以让它工作?”我不太明白你的意思。它之所以有效,是因为它设计就是这样运作的。允许重载
->的全部目的是允许类型模仿某些指针功能。如果它不这样工作,那就没用了。 -
按照您的建议工作有什么好处?
-
->运算符有点“神奇”——只要结果是->运算符,它就会“继续运行”。 -
旁注:对于
ScopePointer,还要考虑重载operator*,或取消引用/间接运算符。或者你可以简单地使用std::unique_ptr<Entity>
标签: c++ class pointers operator-overloading