Я хотел бы присвоить значение 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 в зависимости от условия? Как правильно написать это тогда?
Используйте троичный оператор ?:
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.
При таком простом условии вы можете просто использовать троичный оператор:
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;
}
Если вы делаете
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++