c ++ - 操作员故障 - 访问冲突

时间:2018-02-02 13:31:28

标签: c++ operator-overloading access-violation

我的重载运算符中的访问冲突有一些问题。我意识到我做错了什么,这很可能是一个愚蠢的错误,但我不知道那可能是什么。

我有以下内容:

struct Circle
{
    Circle() : innerCircle(nullptr) {}
    Circle * const innerCircle;

    Circle& operator =(Circle *inner)
    {
        innerCircle[0] = inner;    // Exception thrown: read access violation. this was nullptr.
        return *this;
    }
}

void somefunction(Circle * c)
{
    Circle *c2 = new Circle();
    c->innerCircle[0] = c2;
}

提前感谢您的所有帮助!

2 个答案:

答案 0 :(得分:2)

你的问题似乎是关于指针的推理,而不是运营商特有的任何事情。

  

我有一个指向Circle的const指针。所以,我的指针不能改变地址

true - 无论你的const指针初始化为指向什么对象,它都不能改为指向其他对象。

  

然而地址内的Circle值本身可以改变

是的,如果你的const指针指向一个对象,你可以就地改变对象

  

所以我的尝试是更改innerCircle

中的Circle值

但这假设UPDATE e SET e.PayerType = IIF(p.payer_type=1,'Ep','NonEp'), e.LUPAAlert = IIF((p.payer_type)<>'1',0,IIF(EpEnd<=getdate(),0,IIF(TotVisits<5,1,0))), e.LUPADays = IIF((IIF((p.payer_type)<>'1',0,IIF(EpEnd<=getdate(),0,IIF(TotVisits<5,1,0))))=0,0,EpEnd - CAST(getdate() as date)), e.FinalAlert = IIF((p.payer_type)<>'1',0,IIF(abs(DATEDIFF(millisecond,getdate(),EpEnd))>1,0,1)), e.FinalDays = IIF((IIF((p.payer_type)<>'1',0,IIF(abs(DATEDIFF(millisecond,getdate(),EpEnd))>1,0,1)))=1,abs(DATEDIFF(millisecond,getdate(),EpEnd)),0), e.RAPAlert = IIF(p.payer_type='1',IIF(abs(DATEDIFF(millisecond,getdate(),EpStart))>0,1,0),0), e.RAPDays = IIF((IIF(p.payer_type='1',IIF(abs(DATEDIFF(millisecond,getdate(),EpStart))>0,1,0),0))=1,abs(DATEDIFF(millisecond,getdate(),EpStart)),0) FROM tb_Episode as e LEFT JOIN tb_Payer as p ON (e.CustID = p.company_id) AND (e.PayorType = p.payor_type) LEFT JOIN tb_HHPPS as h ON e.HHPPS = h.HHPPS WHERE e.billed_flag = '0' 指向一个对象。您已将其初始化为innerCircle,这意味着未指向任何对象。这就是nullptr(或旧nullptr的含义

由于你的指针没有指向一个对象,所以你没有任何东西可以合法地改变。由于您声明了指针NULL,因此您也无法将其更改为指向真实对象。

之后,正如borgleader所说,你得到了圆问题的递归定义。

也许const应该只有一个(也许是nullptr)指向圆圈的指针,如果请求它可以变异指向Circle?例如

Circle

答案 1 :(得分:1)

Object * const obj;        // read right-to-left:  const pointer to Object
Object const * obj;        // read right-to-left:  pointer to const Object
Object const * const obj;  // read right-to-left:  const pointer to const Object

看这里

Const before or const after?

所以你有一个常量指针,在构造函数本身中初始化为null。所以你以后不能改变它。所以在行

c->innerCircle[0] = c2;

你正在获得并将永远得到一个空。