2013-11-20 88 views
0

我有这样一段代码:错误无效的转换

class C 
{ 
    virtual vec3 f1(const A* a, B* b){...} 
    virtual vec3 f2(A const* a, B const* b) 
    { 
     vec3 color = f1(a, b); 
     ... 
    } 
} 

我想打电话给f1f2,但我不知道怎么打发b在正确的方法。 现在在编译时,我得到:

error: invalid conversion from 'const B*' to 'B* [-fpermissive]' 

我已经试过vec3 color = f1(a, const_cast<B *>(b));

这将编译,但后来我得到执行分段错误。

请注意,我不能更改任何功能签名。 例如,我也不能改变AB的定义来实现getCopy()函数。

UPDATE:

我发现返回B的修改后的副本,所以我的问题就解决了一个功能。 谢谢大家说服我停止尝试将其直接投射到f1。

回答

3

如果您无法更改功能签名,则无法解决您的问题。逻辑上,f2正在与来电者签订合同:“我将带一个B *并使用它,但我保证我不会修改它指向的B”。如果您将该指针传递给的其他内容请修改B您已违反合同。如果f2旨在修改BB*它不应该是const(也许它应该是B&,作为旁注)。

至于崩溃:修改最初声明为const的对象是未定义的行为。实际上,这意味着编译器可以自由地执行诸如将其存储在只读存储器和其他棘手的事情中。如果您尝试写信给它,所有投注都关闭。它可能会崩溃。它可以工作。任何事情都可能发生。

+0

会解决方案是复制B,并传递该指针?显然,当函数返回时,您不希望B发生更改。我同意这是一个难题... – Floris

+1

这将是奇怪的,因为如果第二个函数修改指针,我会认为这是因为调用者*想要*这个新值。或者,如果没有,那为什么会被修改? – CmdrMoozy

+1

@CmdrMoozy - 有效的点。但这基本上是签名告诉你的。我认为这是一个“学术演习”。 – Floris

1

唯一合乎逻辑的解决办法是

virtual vec3 f2(A const* a, B const* b) 
{ 
    B mutableB(*b); 
    vec3 color = f1(a, &mutableB); 
    ... 
} 

运行时是免费的崩溃是因为修改以前const声明的变量后const_cast是不确定的行为。我猜b原本是const,而f1试图修改它。

从编译器的POV考虑它:你需要两个函数 - f1f2。您可以将常量参数传递给f2,从而保证您不会修改它们。但后来你尝试将它们传递给f1,其中可以修改它们。

0

如果f1修改指针的目标,那么f2;所以f2不能指向const对象。您必须从f2中删除const,而不是尝试用常量对象调用它。您不允许修改const对象,并且如果您尝试执行,程序可能会崩溃(或者存在未定义的行为)。如果f1不修改它,则将该指针更改为const。这听起来像是这样。