c ++ присваивает значение const QList в if … else

Я хотел бы присвоить значение const QList в зависимости от значения указателя.

invar указатель, если это NULL Я хочу присвоить первое значение const QList mylistесли нет NULLдругое значение. Но соблюдается правильность: я не собираюсь менять значение на 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 ;

и у меня ошибка компилятора Ошибка 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 в зависимости от условия? Как правильно написать это тогда?

3

Решение

Используйте троичный оператор ?:

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

Кстати это NULL либо это aList? Вы оба в своем коде выше.

это

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

не работает, потому что каждая переменная zoneList определена только внутри оператора if.

8

Другие решения

При таком простом условии вы можете просто использовать троичный оператор:

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 запрещен, C ++ 98), осталось немного решений, кроме вызова другой функции / метода, с недостатком, который вы должны передать в качестве параметра любую локальную переменную, которая вам нужна вычислить значение const.


Редактировать: Я понимаю, что не полностью ответил на ваш вопрос. Другие уже объяснили, что ваш первый if не может работать, потому что это вопрос области видимости, я не буду много добавлять, за исключением того, что добавление фигурных скобок, вероятно, сделает его более понятным для вас (обратите внимание, что этот код строго совпадает с вашим: фигурные скобки являются необязательными, когда if/else тела — это просто одно утверждение, но их наличие / отсутствие не меняет семантику кода):

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

Если вы делаете

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

сфера действия zoneList ограничивается if или же else ветвь, а снаружи ее уже нет.
И если вы делаете

const QList<Type> zoneList ;

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

zoneList объявлен const и не может быть изменено в if/else,

Для взлома вы можете использовать const_cast, но это плохая практика, поэтому вы должны инициализировать zoneList,

zoneList = invar != 0 ? invar->getZones() : 0; //don't use NULL in C++
1