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

C++ 如何重载运算符=以返回指向成员的指针?,c++,operator-overloading,C++,Operator Overloading,简化如下代码: 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.dat

简化如下代码:

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 obj;

MyStruct *pstruct = obj.data;
没问题

MyClass obj;

MyStruct *pstruct = obj.data;

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


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


首先,您不能为指针重载运算符,好的是您不需要重载,您只需要适当地分配指针:

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

如果您没有访问内部数据成员的权限,则需要提供一个返回指针中断封装的成员函数,或者使调用代码成为MyClass的朋友,以授予对内部类型仍然中断封装的访问权限,少一点。

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

MyClass obj;
MyStruct *pstruct = obj.data; // Assuming that `data` is accessible here
如果您没有访问内部数据成员的权限,则需要提供一个返回指针中断封装的成员函数,或者使调用代码成为MyClass的朋友,以授予对内部类型仍然中断封装的访问权限,只是稍微少一点。

您可以使用转换运算符执行您想要的操作,但我更愿意看到你写一篇文章。这避免了隐式转换的问题

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


int main () {
  MyClass obj;
  MyStruct *pstruct = obj.GetData();
  MyStruct *pstruct2;
  pstruct = obj.GetData();
}
你可以用一个转换操作符做你想做的,但是我更愿意看到你写一个。这避免了隐式转换的问题

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


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

我会尽可能避免向类型添加转换。隐式转换在您需要时(如问题中所述)起作用,但在您不需要时也起作用,打开代码以允许代码中出现愚蠢的错误。突然,如果obj是有效的,就像obj+5一样,这是两个您可能不想要的操作,现在将被允许。大卫:我同意,但从这个问题上很难判断OP真正想要达到什么目的。就是这样!非常感谢你!我会尽可能避免向类型添加转换。隐式转换在您需要时(如问题中所述)起作用,但在您不需要时也起作用,打开代码以允许代码中出现愚蠢的错误。突然,如果obj是有效的,就像obj+5一样,这是两个您可能不想要的操作,现在将被允许。大卫:我同意,但从这个问题上很难判断OP真正想要达到什么目的。就是这样!非常感谢你!请注意,您的示例从不调用运算符=。对象初始化不同于对象分配。请注意,您的示例从不调用运算符=。对象初始化不同于对象分配。