如何重载运算符=以返回指向成员的指针

How to overload operator= to return pointer to a member?

本文关键字:返回 成员 指针 何重载 重载 运算符      更新时间:2023-10-16

有类似以下代码(简化):

struct MyStruct {
    int member1;
    int member2;
};
class MyClass { 
    MyStruct *data;
}

MyClass obj;
// put obj.data in pstruct  
// so obj.data->element1 is the same as pstruct->element1
MyStruct *pstruct = obj;

我不想创建obj.data的副本,但返回相同的指针,所以如果我在pstruct->member1中进行更改,则在obj.data->element1中的更改是相同的(相反)。

这可能吗?

感谢

听起来您想要一个从MyClass:创建MyStruct*的转换运算符

class MyClass {
    MyStruct *data;
public:
    operator MyStruct*() {
       return data;
    }
};

没问题。

MyClass obj;
MyStruct *pstruct = obj.data;

第一件事是你不能为指针重载运算符,好的是你不需要,你只需要适当地分配指针:

MyClass obj;
MyStruct *pstruct = obj.data; // Assuming that `data` is accessible here

如果您没有访问内部data成员的权限,则需要提供访问权限(返回指针的成员函数--破坏封装),或者使调用代码成为MyClassfriend,以授予对内部类型的访问权限(仍然破坏封装,只是稍微少一点)。

可以使用转换运算符执行您想要的操作,但我更希望看到您编写一个getter方法。这避免了隐式转换的问题。

class MyClass {
private:
    MyStruct *data;
public:
    MyStruct* GetData() const { return data; }
};

int main () {
  MyClass obj;
  MyStruct *pstruct = obj.GetData();
  MyStruct *pstruct2;
  pstruct = obj.GetData();
}