在c++中重载间接运算符
Overloading the indirection operator in c++
我的问题很简单。我有一个类模板,它包含一个指向动态分配类型的指针。我想重载间接运算符,以便使用->运算符引用类模板实例时重定向,就像直接使用包含在中的指针一样。
template<class T>
class MyClass
{
T *ptr;
...
// created dynamic resource for ptr in the constructor
};
创建某种类型的myclass:
MyClass<SomeObject> instance;
所以我想要的是,而不是必须键入:
instance.ptr->someMemberMethod();
我只需键入:
intance->someMemberMethod();
即使你instance
不是一个指针,它的行为就好像它是instance
包含的指针一样。如何通过操作员过载来弥补这一差距?
您只需重载operator->
和operator*
:
template<class T>
class MyClass
{
T* ptr;
public:
T* operator->() {
return ptr;
}
// const version, returns a pointer-to-const instead of just a pointer to
// enforce the idea of the logical constness of this object
const T* operator->() const {
return ptr;
}
T& operator*() {
return *ptr;
}
// const version, returns a const reference instead of just a reference
// to enforce the idea of the logical constness of this object
const T& operator*() const {
return *ptr;
}
};
请注意,由于语言创建者的设计决定,您不能重载.
运算符。
此外,您可能认为operator*
会重载乘法运算符,而不是解引用运算符。然而,事实并非如此,因为乘法运算符只接受一个参数(而解引用运算符不接受任何参数),因此编译器可以判断哪个是哪个。
最后,请注意,operator->
返回一个指针,而operator*
返回一个引用。很容易不小心混淆它们。
重载->
运算符:
template <typename T> class MyClass
{
T * p;
public:
T * operator->() { return p; } // #1
T const * operator->() const { return p; }
};
请注意,两个重载都不会改变对象;尽管如此,我们还是决定将#1设为非常量,以便将对象的常量遗留到指针对象上。这有时被称为"深度constness传播"或类似的东西。D语言更进一步。
可以重载成员访问运算符以返回指向要访问的对象的指针:
T * operator->() {return ptr;}
T const * operator->() const {return ptr;}
你可能还想要一个尊重操作符,让它感觉更像一个指针;这将返回一个引用:
T & operator*() {return *ptr;}
T const & operator*() const {return *ptr;}
相关文章:
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- <T> 通过模板化运算符重载将 std::complex 乘以双倍
- C++20概念:需要运算符重载
- 使用赋值运算符重载从类中返回jobject
- 在运算符重载定义中使用成员函数(const错误)
- 字节到位运算符重载C++
- 为什么在运算符重载时需要参考?
- 类中 c++ 的运算符 + 重载
- 算术复合运算符重载为非成员
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 交换运算符 + 重载会导致无限递归
- 如何理解新的运算符重载?
- 向量保持复数的运算符重载
- 如何创建运算符重载?
- 链接列表运算符重载没有打印出我想要的内容
- C++:需要帮助了解运算符重载错误
- 使用模板化运算符重载 XOR 运算符失败
- 如何确保接受的C++模板类型使运算符重载?
- 运算符重载使用运算符+添加类模板