3

我想const QList根据指针的值为 a 赋值。

invar是一个指针,如果是NULL我想分配第一个值const QList mylist,如果不是NULL,另一个值。但是观察到 const 正确性:我不打算在mylist之后更改值。

有没有可能

if(invar)
    const QList<Type> zoneList = invar->getZones();
else
    const QList<Type> zoneList = aList ;

zoneList准确地定义了一次,那么为什么这不起作用?

此外,当我在方法zoneList的下一部分中使用时,我得到了这个编译错误:undeclared identifier.

但我也不允许这样写

    const QList<Type> zoneList ;

    if(invar)
        zoneList = invar->getZones();
    else
        zoneList = NULL ;

我有编译器错误 Error 1

error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const QList<T>' (or there is no acceptable conversion)  

是否可以根据条件为这个 const QList 分配两个不同的值?那么正确的写法是什么?

4

3 回答 3

10

使用三元运算符?:

const QList<Type> zoneList(invar ? invar->getZones() : aList);

顺便说一句,NULLaList吗?你在上面的代码中都有。

这个

if(invar)
    const QList<Type> zoneList = invar->getZones();
else
    const QList<Type> zoneList = aList ;

不起作用,因为每个 zoneList 变量仅在 if 语句中定义。

于 2013-04-24T07:17:25.893 回答
5

有了这样一个简单的条件,您可以只使用三元运算符:

const QList<Type> zoneList = invar ? invar->getZones() : aList;

如果初始化变得比这更复杂并且您碰巧使用 C++11,那么您可以使用 lambdas 实现的新习惯用法:

const QList<Type> zoneList = [] () -> QList<Type> {
                          // ^^ possibly [&] to capture variables

        // some complex stuff that returns a QList<Type>

    }(); // Note the () that calls the lambda immediately

如果您坚持使用 C++03(或者,Stroustrup forbid,C++98),除了调用另一个函数/方法之外,剩下的解决方案很少,缺点是您必须将任何需要的局部变量作为参数传递计算常量值。


编辑:我意识到我还没有完全回答你的问题。其他人已经解释说你的第一个if不能工作,因为这是一个范围问题,我不会添加太多,除了添加大括号可能会让你更清楚(注意这与你的代码完全相同:大括号是当if/else主体只是单个语句但它们的存在/不存在不会改变代码的语义时是可选的):

if (invar) {
    const QList<Type> zoneList = invar->getZones();
}
else {
    const QList<Type> zoneList = aList;
}
于 2013-04-24T07:17:34.030 回答
1

如果你这样做

if(invar)
    const QList<Type> zoneList = invar->getZones();
else
    const QList<Type> zoneList = aList ;

of 的范围zoneList仅限于iforelse分支,在它之外就不存在了。
如果你这样做

const QList<Type> zoneList ;

if(invar)
    zoneList = invar->getZones();
else
    zoneList = NULL ;

zoneList已声明const且不能在if/中更改else

您可以使用 hack const_cast,但这是不好的做法,因此您必须初始化zoneList

zoneList = invar != 0 ? invar->getZones() : 0; //don't use NULL in C++
于 2013-04-24T07:18:36.813 回答