所以,经过对它的研究,我似乎无法找到如何创建一个类箭头运算符,即
class Someclass
{
operator-> () /* ? */
{
}
};
我只需要知道如何使用它并适当地使用它。 - 它的投入是什么? - 它返回什么? - 我如何正确地声明/原型化?
答案 0 :(得分:28)
箭头操作符没有输入。从技术上讲,它可以返回任何你想要的东西,但是它应该返回一个指针或者可以成为指针through chained ->
operators的东西。
->
运算符在使用内置指针取消引用而不是operator*
调用其参数之前自动取消引用其返回值,因此您可以使用以下类:< / p>
class PointerToString
{
string a;
public:
class PtPtS
{
public:
PtPtS(PointerToString &s) : r(s) {}
string* operator->()
{
std::cout << "indirect arrow\n";
return &*r;
}
private:
PointerToString & r;
};
PointerToString(const string &s) : a(s) {}
PtPtS operator->()
{
std::cout << "arrow dereference\n";
return *this;
}
string &operator*()
{
std::cout << "dereference\n";
return a;
}
};
使用它像:
PointerToString ptr(string("hello"));
string::size_type size = ptr->size();
由编译器转换为:
string::size_type size = (*ptr.operator->().operator->()).size();
(返回真实指针所需的.operator->()
次)并输出
arrow dereference
indirect dereference
dereference
但请注意,您可以执行以下操作:
PointerToString::PtPtS ptr2 = ptr.operator->();
在线运行:https://wandbox.org/permlink/Is5kPamEMUCA9nvE
来自Stroupstrup:
将对象 p 转换为指针
之后仍需要成员名称p.operator->()
并不依赖于指向的成员 m 。这就是operator->()
是一元后缀运算符的意义。但是,没有引入新语法,因此在->
答案 1 :(得分:24)
运营商 - &gt;用于超载成员访问权限。一个小例子:
#include <iostream>
struct A
{
void foo() {std::cout << "Hi" << std::endl;}
};
struct B
{
A a;
A* operator->() {
return &a;
}
};
int main() {
B b;
b->foo();
}
输出:
Hi
答案 2 :(得分:0)
class T {
public:
const memberFunction() const;
};
// forward declaration
class DullSmartReference;
class DullSmartPointer {
private:
T *m_ptr;
public:
DullSmartPointer(T *rhs) : m_ptr(rhs) {};
DullSmartReference operator*() const {
return DullSmartReference(*m_ptr);
}
T *operator->() const {
return m_ptr;
}
};
答案 3 :(得分:0)
“箭头”操作符可以通过以下方式重载:
a->b
将被翻译为
return_type my_class::operator->()