【问题标题】:Overloaded assignment operator is not getting called重载的赋值运算符没有被调用
【发布时间】:2010-08-02 10:25:32
【问题描述】:

我已经编写了一个perform 类的重载赋值运算符,用于复制所有变量值。 例如:在 Exp.cpp 中

class perform
{
    LOG *ptr;
int a;
//constructor
//destructor
perform operator=(const perform & rhs){

   ptr = rhs.ptr; a=rhs.s;
return * this;}
};

在另一个类output 中,我声明了一个指向abc 的指针。

perform * ptr = StatCol::CreateCol(frm);
abc = ptr; //this line should invoke assignment overloaded.
           //but in my case it's not invoked.

【问题讨论】:

  • 向我们展示您的实际代码,包括abc 的声明。很难知道是什么错误导致了您的问题,以及您在此处重新输入代码时犯了哪些错误。
  • 代码太大了。或者你问我相关的问题。我会告诉我与我的问题相关的问题。这里 abc 是 Perform 类型的指针。Wehter LHS 可以是指针吗?

标签: c++ assignment-operator


【解决方案1】:

假设 abc 是一个 Perform 对象,您需要取消引用您分配的指针:

abc = * ptr;

如果 abc 本身是一个指针,那么你不能做你所要求的 - 你不能在 LHS 是指针的地方重载赋值。您将不得不取消引用这两个指针:

* abc = * ptr;

【讨论】:

  • @Vishu 照我说的做 - 取消引用两个指针 - 这将使用你的赋值运算符。
  • 请告诉我怎么做?我没有得到。我最终想要的是 abc(Perform 类型的指针)应该包含复制的值。它必须是指针而已。我无法更改。在这种情况下,我如何确保调用我的 asigment 运算符
  • @Vishnu 我已经告诉过你该怎么做 - 我看不出我可以更清楚了。
  • 好的,LHS 不应该是指针,那么只有我的 asigment 运算符被调用是吗?非常感谢。将尝试评论。谢谢
  • 执行&操作符=(const perform & rhs);抱歉,这是实际线路,我错过了上面的参考符号。在这种情况下,LHS 可以是指针?对不起,如果我错了。
【解决方案2】:

此外,通过引用返回更安全,从而避免调用复制构造函数。

    const perform& operator=(const perform & rhs){

     if (this != &rhs)
     {
       ptr = rhs.ptr; a=rhs.s;
     }
     return * this;
   }

【讨论】:

  • 是的,我写的和 aobve 一样。但它没有被调用。 LHS 是一个指针。即 abc 是一个指针
【解决方案3】:
Custom assignment operator works only with user defined types so do like this:

perform p1,p2; 
p1 = p2;
perform *p = &p2;
p1 = *p;  


You can't override assignment of built in types(int , char etc.).

perform *p1,*p2; 
p1 = p2;

It simply copies the address of p2 to p1.

【讨论】:

    【解决方案4】:

    在示例代码中,您正在分配指针,因此您不可能在不取消引用指针的情况下调用赋值运算符。

    而且使用这种设计,做浅拷贝的风险是巨大的。此外,C++ 赋值运算符签名是:“执行 & 运算符 = (...)”,如标准中所述。它必须返回对同一对象的引用,以便编译器按照您的预期考虑它。

    more about assignment operator....

    【讨论】:

    • 标准对返回类型没有要求,从不参与重载。
    猜你喜欢
    • 2013-04-29
    • 2011-11-14
    • 1970-01-01
    • 2013-03-06
    • 2019-03-19
    • 1970-01-01
    • 2013-03-30
    • 2013-02-14
    • 2016-08-30
    相关资源
    最近更新 更多